如何在Powershell脚本中捕获返回值

gtx*_*911 8 powershell return-value invoke

我有一个Powershell脚本(.ps1),该脚本执行具有返回值的其他Powershell脚本

我使用以下命令调用脚本:

$result = Invoke-Expression -Command ".\check.ps1 $fileCommon"

Write-Output $result
Run Code Online (Sandbox Code Playgroud)

输出仅Write-Ouput是具有其他脚本的,而没有返回值是$true$false

如何捕捉其他脚本的收益?

TTo*_*oni 14

return在PowerShell中,语句后面的表达式将像其他所有表达式一样被求值。如果产生输出,则将其写入stdout。您的$ result会收到脚本写入stdout的任何内容。如果将多个内容写入stdout,则将这些内容放入一个数组中。

因此,如果您的check.ps1例如如下所示:

Write-Output "$args[0]"
return $false
Run Code Online (Sandbox Code Playgroud)

然后用

$result = &".\check.ps1" xxx
Run Code Online (Sandbox Code Playgroud)

那么$result将是一个大小为2的对象数组,其值为“ xxx”(字符串)和“ False”(布尔)。

如果您不能更改脚本,从而只将返回值写入stdout(这是最干净的方法),则可以忽略除最后一个值以外的所有内容:

$result = &".\check.ps1" xxx | select -Last 1
Run Code Online (Sandbox Code Playgroud)

现在$result将仅包含“ False”作为布尔值。

如果可以更改脚本,则另一种选择是传递变量名并将其设置在脚本中。

呼叫:

&".\check.ps1" $fileCommon "result"
if ($result) {
    # Do things
}
Run Code Online (Sandbox Code Playgroud)

脚本:

param($file,$parentvariable)
# Do things
Set-Variable -Name $parentvariable -Value $false -Scope 1
Run Code Online (Sandbox Code Playgroud)

-Scope 1指父(主叫)的范围,所以你可以从调用代码读取它。