包含进程的函数返回一个乱码值

时间:2012-01-13 20:42:57

标签: function powershell

整个上午都在试图找到我的返回值出现乱码的地方。既然我终于找到了哪里,我仍然不知道为什么。功能如下:

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
       $Process.StartInfo.Arguments=@("/acceptEULA",$Remote,"-s",$Command)
       $Process.Start()
       $Process.WaitForExit()
       $result = $Process.ExitCode
       return $result
    } else { 
       ... 
    }
 }

奇怪的是,我可以在调试器中逐步完成此操作并观察一切正常。命令运行,$ result用返回代码填充,但调用函数接收返回代码后的True(例如成功时为True0)。我甚至尝试重写返回值并只是说

 return "false"

调用函数收到“Truefalse”。我只能说它与$ Process运行有关。如果我注释掉$ Process.Start(),则返回代码正常运行。有人请保佑我的理智。

1 个答案:

答案 0 :(得分:3)

$ Process.Start()返回一个布尔值,如果成功则返回True。请记住,PowerShell中的函数与标准编程语言的行为不同。 PowerShell函数“返回”或技术上更正确地“输出”任何未被变量捕获或重定向到文件或Out-Null的命令输出。在这种情况下,将“开始”行更改为:

[void]$Process.Start()

$Process.Start() | Out-Null

查看this blog post以获得更深入的解释。