PowerShell从脚本运行脚本:调用失败时调用失败
我有PowerShell从脚本运行脚本:调用失败时调用失败,powershell,Powershell,我有/main.ps1调用/worker1.ps1和worker2.ps1,其中包含参数和main.ps1中的行: # other stuff in main script $args = @() $args += ("-PARAM1", "$VAR1") $args += ("-PARAM2", "$VAR2") $worker1 = "./workers/worker1.ps1" Invoke-Expression "$worker1 $args" -ErrorAction Stop # o
/main.ps1
调用/worker1.ps1
和worker2.ps1
,其中包含参数和main.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
我怎样才能避免这种情况,并在一个被调用的脚本失败时立即使主脚本失败 因为我没有你的程序要处理,所以我创建了两个程序来复制我认为你在说的内容,例如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"
Call Number: 1
0
Call Number: 2
1
Call Number: 1
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"
Call Number: 1
0
Call Number: 2
1
Call Number: 1
1
因此,如果第一次调用的ReturnCD为0。i、 e.成功输出如下所示:
$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"
Call Number: 1
0
Call Number: 2
1
Call Number: 1
1
如果您将ReturnCD更改为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"
Call Number: 1
0
Call Number: 2
1
Call Number: 1
1
没有打第二个电话
HTH- 根据建议,避免将
用作自定义变量,因为它是所谓的由PowerShell本身管理的变量$args
- );当然
- 在数据结构中使用数组而不是数组来表示参数,然后使用来传递它
- 如果脚本使用带有非零参数的
表示失败,请查询自动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" }
}
$Result=调用表达式“$worker1$args”-错误操作停止 主脚本中的其他内容 如果($结果) { $worker2=“./workers/worker2.ps1” 调用表达式“$worker2$args”-ErrorAction Stop
}经过几次尝试,我找到了一个简单的方法:
# 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
首先,不要使用自定义变量名
$args
,因为这是一个问题,这是否回答了您的问题?OP已指示脚本通过退出1发出故障信号,而不是通过其输出。总的来说:请。