NSTask:程序启动另一个程序,该怎么办?

时间:2014-04-10 12:34:55

标签: cocoa path terminal sh nstask

我希望通过

使用NSTask我可以在终端中执行的操作
$ myprogram myfile.ext

我知道myprogram(我对此程序没有任何控制权)会启动另一个程序myauxprogram。此外,myprogram的路径为path1myprogram的路径为path2

如果我这样做

 NSTask * myTask = [[NSTask alloc] init];

 NSArray * arguments = @[@"myfile.ext"] ;

 [myTask setCurrentDirectoryPath:[URLOfTheFolder path]];
 [myTask setLaunchPath:@"/path1/myprogram"];
 [myTask setArguments:arguments];

 [myTask launch] ;

我收到以下错误sh: myauxprogam: command not found

如果我在path1myauxprogram中创建了符号链接,问题就是一样。

2 个答案:

答案 0 :(得分:0)

看起来你大多都有这个想法,你只是缺少一些关键元素。 NSTask应该有一个已定义的LaunchPath,例如/usr/bin/sh/usr/bin等,具体取决于您需要设置参数和选项的路径类型。< / p>

NSTask *auxTask;
NSTask *auxPath = @"./path1/myprogram";        // period might be needed
NSTask *auxArgs = @"myfile.ext";

auxTask = [[NSTask alloc] init];
[auxTask setLaunchPath:@"/usr/bin/sh"];         // use shell

[auxTask setArguments:[NSArray arrayWithObjects:
                             @"-c",             // -c will exec as shell cmd
                             auxPath,
                             auxArgs,
                             nil]];

    // using `try` is optional

    @try
    {
        [auxTask launch];
    }
    @catch(id exc)
    {
        auxTaskSuccess = NO;
    }
    [auxTask release];

return;

不知道这是否有效,但这是你可能设置的方式。如果您遇到错误问题或NSTask失败,您可以使用auxTask NSLog设置NSArray,以确切了解它正在做什么。

答案 1 :(得分:0)

问题是:

您需要[myTask setEnvironment:...]以便任务知道哪些是环境变量(PATH等)。