2011-01-07 37 views
0

我發現了一些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 

它的作品!

有什麼不對?

+0

這裏有很多關於SO已經使用`NSTask`和`NSPipe`來做這種事情的例子,例如, HTTP://計算器。com/questions/3444178/nstask-nspipe-objective-c-command-line -help – 2011-01-07 17:04:24

+0

你好,試試這個:NSTask * server = [NSTask new]; \t [server setLaunchPath:@「/ bin/sh」]; \t [server setArguments:[NSArray arrayWithObject:@「ioreg -c BNBMouseDevice | grep BatteryPercent」]]; \t \t NSPipe * outputPipe = [NSPipe pipe]; \t [server setStandardInput:[NSPipe pipe]]; \t [server setStandardOutput:outputPipe]; \t \t [server launch]; \t [server waitUntilExit]; \t [server release]; \t \t NSData * outputData = [[outputPipe fileHandleForReading] readDataToEndOfFile]; \t NSString * outputString = [[[NSString alloc] initWithData:outputData encoding:NSUTF8StringEncoding] autorelease]; – cocos2dbeginner 2011-01-07 17:15:04

+0

但它說沒有這樣的文件或目錄,但如果我在終端中這樣做:ioreg -c BNBMouseDevice | grep BatteryPercent //它的工作原理!有什麼不對? – cocos2dbeginner 2011-01-07 17:15:33

回答

2

當調用/bin/sh,你需要傳遞-c如果您希望shell運行命令。它應該是等同於:

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

爲此,您可以用

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

注意,我做了兩個轉變更換

[server setArguments:[NSArray arrayWithObject:@"ioreg -c BNBMouseDevice | grep BatteryPercent"]]; 

:該參數是有兩個數組要素,即 「-c」 和 「/ usr/sbin目錄/名爲ioreg -c BNBMouseDevice |在/ usr /斌/ grep的BatteryPercent」,而且我也換成ioreg/usr/sbin/ioreg(和grep與/usr/bin/grep)明確表示您對這些特定程序感興趣。

3

NSTask啓動一個將一組參數作爲字符串數組使用的命令。 NSTask不會執行任何shell解析魔術,也不能將該字符串作爲參數傳遞給sh,並以此方式解析它。有可能有這樣做的方法,但有一個更好的解決方案。

只需通過NSTask運行ioreg命令,通過標準方法獲取輸出,然後對返回的字符串進行簡單枚舉以找到所需的行。雖然還有幾行代碼,但它會比通過殼體抽取更多的代碼更脆弱(如果您提供某種類型的參數,那麼會更少)。這很容易做到。

請參閱this document瞭解更多信息。

相關問題