PowerShell从脚本运行脚本:如果调用失败,则调用者失败

时间:2020-06-13 19:01:55

标签: powershell

我有./main.ps1用参数(来自main.ps1的行)调用./worker1.ps1worker2.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

如何避免这种情况并在其中一个调用失败后立即使主脚本失败?

4 个答案:

答案 0 :(得分:3)

将它们放在一起:

# 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
相关问题