我有./main.ps1
用参数(来自main.ps1的行)调用./worker1.ps1
和worker2.ps1
:
# other stuff in main script
$args = @()
$args += ("-PARAM1", "$VAR1")
$args += ("-PARAM2", "$VAR2")
$worker1 = "./workers/worker1.ps1"
Invoke-Expression "$worker1 $args" -ErrorAction Stop
# other stuff in main script
$worker2 = "./workers/worker2.ps1"
Invoke-Expression "$worker2 $args" -ErrorAction Stop
如果worker1.ps1
失败,则有exit 1
行,
问题在于,即使worker1.ps1
失败,worker2.ps1
也会调用main.ps1
如何避免这种情况并在其中一个调用失败后立即使主脚本失败?
答案 0 :(得分:3)
按照Theo的建议,避免使用$args
作为自定义变量,因为它是由PowerShell本身管理的所谓的automatic variable。
Invoke-Expression
should generally be avoided;肯定是don't use it to invoke an external program or PowerShell script。
使用hash table而不是 array 在数据结构中表达参数,然后使用splatting传递它。
如果脚本使用带有非零参数的exit
来指示失败,请查询自动$LASTEXITCODE
变量以推断失败。
将它们放在一起:
# other stuff in main script
# Define the arguments as a *hashtable*.
$htArgs = @{
PARAM1 = $VAR1
PARAM2 = $VAR2
}
foreach ($worker in './workers/worker1.ps1', './workers/worker2.ps1') {
& $worker @htArgs # Note the @ sigil for splatting
if ($LASTEXITCODE) { Throw "$worker signaled failure via exit code $LASTEXITCODE" }
}
答案 1 :(得分:2)
由于我没有要处理的程序,因此我创建了一对夫妇来复制我以为你在说的话,例如失败时,Worker1.ps1返回1。
所以主程序看起来像这样:
$TFArgs = @{ReturnCD = 0
CallNumber = 1}
$RVal = & .\test\Test-CallFail.ps1 @TFArgs
$RVal
Write-Host " "
If ($RVal -ne 1) {
$TFArgs = @{ReturnCD = 1
CallNumber = 2}
$RVal = & .\test\Test-CallFail.ps1 @TFArgs
$Rval
}
被调用程序如下:
Param (
[INt] $ReturnCd,
[Int] $CallNumber
)
Write-Host "Call Number: $CallNumber"
"$ReturnCd"
因此,如果第一个调用的ReturnCD为0,即成功,输出将如下所示:
Call Number: 1
0
Call Number: 2
1
如果将ReturnCD更改为1,即失败,则它看起来像这样:
Call Number: 1
1
第二个电话没有拨打。
HTH
答案 2 :(得分:1)
$ Result =调用表达式“ $ worker1 $ args” -ErrorAction Stop
如果($ Result) { $ worker2 =“ ./workers/worker2.ps1” 调用表达式“ $ worker2 $ args” -ErrorAction Stop }
答案 3 :(得分:0)
经过几次尝试,我发现了简单的方法:
# other stuff in main script
& ./workers/worker1.ps1 -PARAM1 "$VAR1" -PARAM2 "$VAR2"
if ($LASTEXITCODE -ne 0) {
Write-Output "worker1 has failed"
exit 1
} else {
Write-Output "worker1 has completed"
}
# other stuff in main script
& ./workers/worker2.ps1