Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PowerShell从脚本运行脚本:调用失败时调用失败_Powershell - Fatal编程技术网

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

  • 根据建议,避免将
    $args
    用作自定义变量,因为它是所谓的由PowerShell本身管理的变量

  • );当然

  • 在数据结构中使用数组而不是数组来表示参数,然后使用来传递它

  • 如果脚本使用带有非零参数的
    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发出故障信号,而不是通过其输出。总的来说:请。