我如何为终端命令中的路径做空间



已解决

我需要添加两个额外的" ",所以这条线看起来像:

  let finalString = removeExtension.stringByReplacingOccurrencesOfString(" ", withString: "\\ ")

我有一个用Swift编写的应用程序,该应用程序运行终端命令(UNIX),该命令打开并关闭应用程序。

当选择的应用程序是一个诸如" notes.app"之类的单词时,该应用程序的工作原理很好,但是每当它是一个带有" app store.app"之类的单词时,我的程序似乎并没有执行命令正确。

所以,这有效:

 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经验来知道为什么会发生这种情况?我不知道它是否在输入错误的数据,因为我写了错误的脚本。

有关额外信息,如果有帮助,可变客户端由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

您不需要在报价中界定空格(作为字符串)。

clientUsed = "App Store"
let killCommand = "do shell script "killall (clientUsed)""
let openCommand = "do shell script "open --hide --background /Applications/(clientUsed).app""

为什么在世界范围内,您要通过Swift通过AppleScript通过Shell运行killall?只需使用[NSTask launchedTaskWithLaunchPath:arguments:]直接执行即可。[1]

有关启动其他应用程序,请使用-[NSWorkspace launchApplication:]-[NSWorkspace launchApplicationAtURL:options:configuration:error:]

-

[1]请注意,在OS X上,您应仅使用kill/killall终止非GUI或悬挂过程。结束正常工作的GUI过程的正确方法是发送quit Apple事件。令人讨厌的是,由于NSAppleEventDescriptor缺乏发送方法,如今直接从OBJC/Swift进行此操作是PITA。您可以使用AESendMessage函数,但这是一个旧的碳c API,因此使用NSAppleScript或直接通过AppleScript-Objc直接桥接到AppleScript中可能更简单,更安全,这很容易从OBJC完成,并且有点可行(如果有点更多工作)来自Swift。

最新更新