如何在 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
我有一个 powershell 脚本 (.ps1),它 执行其他具有 return 值的 Powershell 脚本。
我用这个命令调用脚本:
$result = Invoke-Expression -Command ".\check.ps1 $fileCommon"
Write-Output $result
输出只是具有其他脚本的 Write-Ouput
而不是 $true
或 $false
.
如何从其他脚本中捕获 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