2011-07-10 80 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