如何在终端命令中为路径创建空格?

时间:2015-05-06 11:17:35

标签: xcode swift unix applescript

解决

我需要添加两个额外的" \"所以这一行看起来像这样:

  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

2 个答案:

答案 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