大佬教程收集整理的这篇文章主要介绍了swift – 如何通过NSUserUnixTask传递参数然后通过脚本访问?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
NSUserScriptTask是脚本调用代码的基础,NSUserAppleScriptTask和NSUserAutomatorTask子类都允许设置变量以将信息从Swift传递到脚本:
Passing variables to an AppleScript
Setting NSUserAutomatorTask variables without requiring Automator Workflows to declare that variable
这留下了NSUserUnixTask,它不支持设置变量.它改为支持一个名为arguments的[String]数组.
执行脚本时,我想从Mac应用程序传递3个变量:
let folderURL: String? = "/files/" let fileURLs: [String] = ["/files/file1","/files/file2"] let SELEctionType: Int? = 1 let arguments: [String] = ["how","should","arguments","be","formatted","?"] let unixScript = try! NSUserUnixTask(url: url) unixScript.execute(withArguments: arguments) { (error) in if let error = error { print(error) } }
必须将3个swift变量压缩为单个[String]数组,以便NSUserUnixTask用作其参数参数.
当脚本运行时,我希望以原型方式为脚本作者提供相同参数的访问权限:
#! /bin/bash say "How should the script then access/parse the arguments?" say $@ #says the arguments
>位置参数(开始时必需参数的固定数量)
>可选的命名参数(样式的任何参数-flag值)
>更多参数(可变数量的附加参数)
import Foundation let sHellScript = CommandLine.arguments[1] let folderURL: String = "/files/" let fileURLs: [String] = ["/files/file1","/files/file2"] let SELEctionType: Int? = 1 var arguments = [String]() // script.sh <folder> [-type <type>] file1,file2,... arguments.append(folderURL) // <folder> is mandatory if let type = SELEctionType { // -type <type> is optional arguments.append("-type") arguments.append("\(typE)") } arguments += fileURLs // file1,... (if it can't be empty check it herE) assert(FileManager.default.fileExists(atPath: sHellScript)) let unixScript = try! NSUserUnixTask(url: URL(fileURLWithPath: sHellScript)) let stdout = FileHandle.standardOutput unixScript.standardOutput = stdout unixScript.execute(withArguments: arguments) { error in if let error = error { print("Failed: ",error) } exit(0) } dispatchMain() // I'm not swift script expert,there may be a better way
#!/bin/bash # mandatory positional arguments FOLDER=$1 && shift # other mandatory arguments goes here TYPE=7 # default type FILES=() while [[ $# -gt 0 ]]; do arg=$1 case $arg in -typE) TYPE=$2 && shift && shift ;; # other named parameters here *) FILES+=($1) && shift ;; esac done echo FOLDER: '<'${FOLDER}'>' echo TYPE: '<'${TYPE}'>' echo FILES: '<'${FILES[@]}'>' exit 0
ScriptRunner /path/to/script.sh
输出:
FOLDER: </files/> TYPE: <1> FILES: </files/file1 /files/file2>
我使用swift包管理器来构建:
// swift-tools-version:4.2 import PackageDescription let package = Package( name: "ScriptRunner",dependencies: [],targets: [ .target(name: "ScriptRunner",dependencies: []) ] )
以上是大佬教程为你收集整理的swift – 如何通过NSUserUnixTask传递参数然后通过脚本访问?全部内容,希望文章能够帮你解决swift – 如何通过NSUserUnixTask传递参数然后通过脚本访问?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。