【问题标题】:PowerShell run script from script: fail caller if called failsPowerShell 从脚本运行脚本:如果调用失败,则调用者失败
【发布时间】:2020-06-13 19:01:55
【问题描述】:

我有 ./main.ps1 调用 ./worker1.ps1worker2.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 调用

一旦被调用的脚本之一失败,我怎么能避免这种情况并让主脚本失败?

【问题讨论】:

标签: powershell


【解决方案1】:

把它们放在一起:

# 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" } 
}

【讨论】:

    【解决方案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

    【讨论】:

      【解决方案3】:

      $Result = Invoke-Expression "$worker1 $args" -ErrorAction Stop

      主脚本中的其他内容

      如果($结果) { $worker2 = "./workers/worker2.ps1" 调用表达式“$worker2 $args”-ErrorAction Stop }

      【讨论】:

      【解决方案4】:

      经过几次尝试,我找到了简单的方法:

      # 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-19
        • 1970-01-01
        • 2015-04-18
        • 1970-01-01
        • 1970-01-01
        • 2011-04-16
        相关资源
        最近更新 更多