解决
我需要添加两个额外的" \"所以这一行看起来像这样:
let finalString = removeExtension.stringByReplacingOccurrencesOfString(" ", withString: "\\\\ ")
我有一个用swift编写的应用程序,它运行一个打开和关闭应用程序的终端命令(unix)。
当选择的应用程序是" notes.app"这样的单词时,应用程序运行得非常好,但是只要它是一个带有两个单词的应用程序,例如" App Store.app&# 34;,我的程序似乎没有正确执行命令。
所以,这有效:
clientUsed = "notes"
let killCommand = "do shell script \"killall \(clientUsed)\""
let openCommand = "do shell script \"open --hide --background /Applications/\(clientUsed).app\""
但这并不是:
clientUsed = "App\ Store"
let killCommand = "do shell script \"killall \(clientUsed)\""
let openCommand = "do shell script \"open --hide --background /Applications/\(clientUsed).app\""
有没有unix,applescript或swift经验的人知道为什么会这样吗?我不知道它是否输入了错误的数据,因为我写错了脚本。
如果有帮助的额外信息,变量clientUsed由NSOpenPanel()
URL确定。这是代码:
selectedApp = openPanel.URL!
var lastComponent = selectedApp?.lastPathComponent
var removeOptional : String = lastComponent!
let removeExtension = removeOptional.stringByReplacingOccurrencesOfString(".app", withString: "")
let finalString = removeExtension.stringByReplacingOccurrencesOfString(" ", withString: "\\ ")
self.clientUsed = finalString
答案 0 :(得分:0)
您不需要在引号内分隔空格(作为字符串)。
clientUsed = "App Store"
let killCommand = "do shell script \"killall \(clientUsed)\""
let openCommand = "do shell script \"open --hide --background /Applications/\(clientUsed).app\""
答案 1 :(得分:0)
为什么世界上你通过AppleScript通过Swift运行killall
?只需使用[NSTask launchedTaskWithLaunchPath:arguments:]
直接执行即可。 [1]
至于启动其他应用程序,请使用-[NSWorkspace launchApplication:]
或-[NSWorkspace launchApplicationAtURL:options:configuration:error:]
。
-
[1]请注意,在OS X上,您应该只使用kill
/ killall
来终止非GUI或挂起的进程。结束正常工作的GUI过程的正确方法是向其发送quit
Apple事件。令人讨厌的是,由于NSAppleEventDescriptor
lack of a send method,这些天直接从ObjC / Swift这样做有点像PITA。您可以使用AESendMessage
函数,但这是一个传统的Carbon C API,因此use NSAppleScript
可能更简单,更安全,或者只是通过AppleScript-ObjC直接连接到AppleScript,这很容易做from ObjC并且也可行(如果多一点工作)from Swift。