如何在我的可可应用程序中运行此命令?

时间:2011-01-07 16:54:42

标签: objective-c macos command

我在NSTask中发现了一些执行命令但我无法正常运行的事情。

这是我的命令:

ioreg -c BNBMouseDevice | grep BatteryPercent

如何在我的可可应用程序中运行此功能? (当然是以编程方式)

非常感谢你的帮助。

我试过这个:

NSTask *server = [NSTask new];
[server setLaunchPath:@"/bin/sh"];
[server setArguments:[NSArray arrayWithObject:@"ioreg -c BNBMouseDevice | grep BatteryPercent"]];
NSPipe *outputPipe = [NSPipe pipe];
[server setStandardInput:[NSPipe pipe]];
[server setStandardOutput:outputPipe];
[server launch];
[server waitUntilExit];
[server release];
NSData *outputData = [[outputPipe fileHandleForReading] readDataToEndOfFile];
NSString *outputString = [[[NSString alloc] initWithData:outputData encoding:NSUTF8StringEncoding] autorelease]; 

但它没有说这样的文件或目录,但如果我在终端中这样做:

ioreg -c BNBMouseDevice | grep BatteryPercent

它有效!

出了什么问题?

2 个答案:

答案 0 :(得分:3)

NSTask启动一个命令,该命令将一组参数作为字符串数组。 NSTask不执行任何shell解析魔法,也不能将字符串作为参数传递给sh并让它以这种方式解析它。可能有一种方法可以这样做,但有更好的解决方案。

只需通过ioreg运行NSTask命令,通过标准方法获取输出,然后对返回的字符串进行简单枚举,以找到所需的行。虽然还有一些代码行,但是如果你提供某种类型的参数,那么它的脆弱程度会小得多(而且安全漏洞也少一些),而不是试图通过shell。这很容易做到。

有关详细信息,请参阅this document

答案 1 :(得分:2)

调用/bin/sh时,如果希望shell运行命令,则需要传递-c。它应该等同于:

/bin/sh -c "/usr/sbin/ioreg -c BNBMouseDevice | /usr/bin/grep BatteryPercent"

您可以通过替换

来完成此操作
[server setArguments:[NSArray arrayWithObject:@"ioreg -c BNBMouseDevice | grep BatteryPercent"]];

[server setArguments:[NSArray arrayWithObjects:@"-c", @"/usr/sbin/ioreg -c BNBMouseDevice | /usr/bin/grep BatteryPercent", nil]];

请注意,我做了两处更改:参数是一个包含两个元素的数组,即“-c”和“/ usr / sbin / ioreg -c BNBMouseDevice | / usr / bin / grep BatteryPercent”,我ve还将ioreg替换为/usr/sbin/ioreg(并将grep替换为/usr/bin/grep),以明确表示您对这些特定程序感兴趣。