如何在 Powershell 脚本中捕获 return 值

How catch return value in a Powershell script

我有一个 powershell 脚本 (.ps1),它 执行其他具有 return 值的 Powershell 脚本

我用这个命令调用脚本:

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

Write-Output $result

输出只是具有其他脚本的 Write-Ouput 而不是 $true$false.

的 return 值

如何从其他脚本中捕获 return?

PowerShell 中 return 语句后面的表达式像其他所有表达式一样被计算。如果它产生输出,则将其写入标准输出。您的 $result 接收脚本写入 stdout 的任何内容。如果不止一个东西被写入标准输出,你会在一个数组中得到这些东西。

因此,如果您的支票。ps1 例如看起来像这样:

Write-Output "$args[0]"
return $false

你用

调用它
$result = &".\check.ps1" xxx

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

如果您不能更改脚本以便只将 return 值写入标准输出(这将是最干净的方式),您可以忽略除最后一个值之外的所有内容:

$result = &".\check.ps1" xxx | select -Last 1

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

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

致电:

&".\check.ps1" $fileCommon "result"
if ($result) {
    # Do things
}

脚本:

param($file,$parentvariable)
# Do things
Set-Variable -Name $parentvariable -Value $false -Scope 1

-Scope 1 指的是父(调用者)作用域,因此您可以直接从调用代码中读取它。

从脚本函数 return 获取值的正确可靠方法是设置变量。如果有人将新的输出添加到流中,依赖输出的位置在未来很容易被破坏; Write-Output/Write-Warning/Write-Verbose,等等...

与任何其他语言不同,

Return 在脚本函数中具有误导性。我在 powershell 中看到了另一种使用 类+functions 的机制,但我怀疑这就是你要找的东西。

function Test-Result{
            Param(
                $ResultVariableName
            )
 try{
     Write-Verbose "Returning value"
     Set-Variable -Name $ResultVariableName -Value $false -Scope 1
     Write-Verbose "Returned value"
     return $value # Will not be the last output
    }
    catch{
     Write-Error "Some Error"
    }
    finally{
     Write-Output "finalizing"
     Write-Verbose "really finalizing"
    }

#Try these cases 

$VerbosePreference=Continue

Test-Result 

$MyResultArray=Test-Result *>&1; $MyResultArray[-1] # last object in the array

Test-Result "MyResult" *>&1; $MyResult