整个上午都在试图找到我的返回值出现乱码的地方。既然我终于找到了哪里,我仍然不知道为什么。功能如下:
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(),则返回代码正常运行。有人请保佑我的理智。
答案 0 :(得分:3)
$ Process.Start()返回一个布尔值,如果成功则返回True。请记住,PowerShell中的函数与标准编程语言的行为不同。 PowerShell函数“返回”或技术上更正确地“输出”任何未被变量捕获或重定向到文件或Out-Null的命令输出。在这种情况下,将“开始”行更改为:
[void]$Process.Start()
或
$Process.Start() | Out-Null
查看this blog post以获得更深入的解释。