2012-01-13 81 views
1

花了我整整一個早上試圖找到我的返回值出現亂碼的位置。現在我終於找到了地方,但我仍然不知道爲什麼。功能如下:包含進程的函數返回一個亂碼值

function Run-RemoteCommand { 
param(...) # params are $Remote (host) $Command $Credentials $Quiet (optional switch) 

    if($Quiet) { 
     $Process = New-Object System.Diagnostics.Process 
     $Process.StartInfo.UseShellExecute=$false 
     $Process.StartInfo.Domain=$Credentials.GetNetworkCredential().Domain 
     $Process.StartInfo.UserName=$Credentials.GetNetworkCredential().UserName 
     $Process.StartInfo.Password=$Credentials.Password 
     $Process.StartInfo.WindowStyle="Hidden" 
     $Process.StartInfo.FileName=$PSExec 
     [email protected]("/acceptEULA",$Remote,"-s",$Command) 
     $Process.Start() 
     $Process.WaitForExit() 
     $result = $Process.ExitCode 
     return $result 
    } else { 
     ... 
    } 
} 

有什麼奇怪的是,我可以在一個調試器,通過這一步,看着一切工作正常。該命令運行時,$ result被返回代碼填充,但調用函數接收True後附加到返回代碼(例如True0成功)。我甚至試圖覆蓋返回值,只是說

return "false" 

調用函數收到「Truefalse」。我只能說,它與$ Process運行相關。如果我註釋掉$ Process.Start(),則返回代碼正常工作。有人請保存我的理智。

回答

3

$ Process.Start()返回一個布爾值,如果成功則返回True。請記住,PowerShell中的函數與標準編程語言的行爲不同。 PowerShell功能「返回」或更技術性地正確「輸出」任何未被變量捕獲或重定向到文件或Out-Null的命令輸出。在這種情況下更改開始行:

[void]$Process.Start() 

$Process.Start() | Out-Null 

退房this blog post進行更深層次的解釋。

+0

謝謝基思,現在我不必把所有的錢花在羅迦身上,以挽救我即將退出的頭髮!在這個環節也有很好的閱讀。尤其是在這裏應用並開始的部分「我在PowerShell新聞組上一次又一次地看到了這個問題......」 – ASTX813 2012-01-13 21:41:58