2011-07-10 34 views
1

我遇到问题NSProcessInfo'sarguments属性。我正在创建一个命令行工具,需要解码使用PHP脚本从互联网传递的base64代码以及其他一些参数。数据通过很好,但由于某种原因。 [[NSProcessInfo processInfo] arguments]返回21个参数,即使我只传递一个base64字符串。自变量]问题目标-C

下面是它的Objective-C的一面:

NSArray *arguments = [[NSProcessInfo processInfo] arguments]; 

if ([[arguments objectAtIndex:1] isEqualToString:@"-s"]) 
{ 
    if ([arguments objectAtIndex:2] == nil) 
    { 
     printf("Error: No data\n"); 
     [pool drain]; 
     return 0; 
    } 

    NSString*data = [arguments objectAtIndex:2]; 

    if ([data length] == 0) 
    { 
     printf("Error: No data\n"); 
     [pool drain]; 
     return 0; 
    } 

    NSString*password = @""; 

    if ([[arguments objectAtIndex:3] isEqualToString:@"-p"]) 
    { 
     if ([arguments objectAtIndex:4] == nil) 
     { 
      printf("Error: No password\n"); 
      [pool drain]; 
      return 0; 
     } 
     else 
     { 
      password = [NSString stringWithString:[arguments lastObject]]; 
     } 
    } 

NSLog(@"Args: %i\n\n",[arguments count]); //returns 21? I expect 3. 

基于64位的代码是有点长,所以我把它here。有谁知道为什么这段代码会返回这么多参数?它应该只是一个字符串? 编辑:我剥离我的PHP脚本中的空格。看到这里:

<?php 

$url = $_GET['data']; 

$query = "/Library/WebServer/email/emailsender -s"; 
$password = "-p somePassword"; 

$commandStr = trim("$query $url $password"); 

$commandStr = removeNewLines($commandStr); 

echo $commandStr; 

$output = shell_exec($commandStr); 

echo "<pre>Output: $output</pre>"; 

function removeNewLines($string) { 

    $string = str_replace("\t", ' ', $string); 
    $string = str_replace("\n", ' ', $string); 
    $string = str_replace("\r", ' ', $string); 
    $string = str_replace("\0", ' ', $string); 
    $string = str_replace("\x0B", ' ', $string); 

    return $string; 

} 

?> 
+0

你可能想要'NSLog(@“%@”,arguments)',这样你就可以看到你的程序到底是什么。您的问题可能会立即变得明显。首先,base64字符串中有13个空白字符,它们自动至少包含14个参数。 (如果您希望将其作为单个参数进行处理,则必须引用base64数据。) – zneak

+0

在发布之前,我已经这样做了。它显示了一个将base64代码分解成18个部分的数组。 – Pripyat

+0

那么也许你可以分享结果:) – zneak

回答

2

当您通过命令行向程序发送参数时,每个参数由空格字符分隔。这意味着如果你发布一个包含空格的字符串,你的程序会将其解释为多个参数。为了防止这种行为,你需要引用你的字符串。

+0

这个技巧! – Pripyat

2

当我在你的贴子页面上显示Base64字符串为“原始”时,我看到很多空间。所以最有可能的是arguments是正确的,你的PHP脚本以错误的方式调用Objective-C程序。简单的解决方法可能是在传递字符串之前删除任何空格,或者正确地将其转义。

+0

我确实删除了空格 - 请参阅上面编辑的文章。 – Pripyat

+0

@David Schiefer:不,你用*空格*代替换行符和制表符,这就是问题所在。根据问题[我如何正确处理PHP Shell_exec中的空格?](http://stackoverflow.com/questions/378490/how-do-i-to-properly-handle-spaces-in-php-shell- exec)你应该使用'escapeshellarg'来转义字符串(或者在调用''''''''''''''''''''''''''''''''替换''' – DarkDust

+0

只是把它放在引号中就有窍门。但我会将此标记为+1。谢谢! :) – Pripyat