2012-01-13 72 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

相关问题