2017-02-05 51 views
1

当我直接在终端中输入时 - 它按预期方式工作,并且如果应用程序未运行则返回,如果没有运行,则返回。终端命令无法识别?

lsappinfo list | grep -v grep | grep bundleID | grep com.test.myapp | wc -l

但是,当我使用下面的代码(swift 3 - macOS)时,它说这是一个无法识别的命令?

// DECLARE TASK 
    let task = Process() 

    // DEFINE THE PATH 
    task.launchPath = "/usr/bin/lsappinfo" 

    // DEFINE THE ARGUMENTS 
    task.arguments = ["list | grep -v grep | grep bundleID | grep com.test.myapp | wc -l"] 

    // DECLARE outputPipe 
    let outputPipe = Pipe() 

    // RUN THE TASK 
    task.launch() 

    // DECLARE data 
    let data = outputPipe.fileHandleForReading.readDataToEndOfFile() 

    // DECLARE output AS THE UTF-8 STRING OF THE TERMINAL'S OUTPUT 
    let output = NSString(data: data, encoding: String.Encoding.utf8.rawValue) 
     print(output!) 

    if output == "0" { 
     print("App is not running!") 

    } else { 
     print("App is running!") 
    } 

    // PAUSE UNTIL COMPLETED 
    task.waitUntilExit() 

是否有人可以告诉我在哪里出了问题,因为我是新来的斯威夫特,并且仍然在努力让我的头周围的语言/语法。

谢谢大家提前。

+0

查看'NSWorkspace'及其'runningApplications'方法,以获得更简单的解决方案。示例这里http://stackoverflow.com/questions/37646605/how-can-you-get-information-such-as-users-window-for-example-using-the-nstask-c。 –

+0

感谢马丁 - 这就像一个魅力! –

回答

1

管道操作不是进程的参数,它们是连接多个单独进程的shell的指令。如果swift中的任务构造需要一个进程和一组命令行参数,那么在这里执行此操作的一种方法可能是启动bash二进制文件,然后将-c "lsappinfo list | grep -v grep | grep bundleID | grep com.test.myapp | wc -l"作为全套参数。这样,你可以让bash理清完成管道所需的东西。

+0

你打败了我! – Grimxn

+0

@cnettel,我已经尝试了你的建议,但是这给了我相同的错误信息。我只需要检查一个外部应用程序是否正在运行,我会考虑Martin。 R的解决方案,看看我是否可以制定出如何做到这一点。谢谢你们俩! –