在Powershell中从try / catch中恢复变量

时间:2014-06-18 17:11:15

标签: powershell

我在使用重启脚本时遇到问题。我试图向一系列服务器发送一个Restart-Computer命令并捕获失败,以便我可以用另一种方式重试它们(在这种情况下通过VIC)。

这是我的代码段

try {
    Restart-Computer -ComputerName $_.Servername -Credential $cred -Force -ErrorAction Stop
    }
catch [system.exception] {
    #Create output object
    $output = [pscustomobject] @{
        Servername = $_.Servername
        Domain = $_.Domain
        Environment = $_.Environment
        VIC = $_.VIC
        }
    Export-Csv -InputObject $output -Path C:\temp\VICredo.csv -Force -NoTypeInformation
    }
}

这里的问题是$ _变量不会归结为catch块,所以我无法将它们写入“重试列表”。任何人都可以想到一种有效的方法吗?

2 个答案:

答案 0 :(得分:1)

遇到终止错误时,原始管道停止。另一个管道已启动,该管道中的错误是什么。

你可以通过切换到使用foreach循环来解决这个问题。

答案 1 :(得分:0)

您始终可以将$_分配给专用变量,并在try / catch块中使用该变量:

... | ForEach-Object {
  try {
    $comp = $_
    Restart-Computer -ComputerName $comp.Servername ...
  } catch [System.Exception] {
    #Create output object
    $output = [PsCustomObject] @{
      Servername  = $comp.Servername
      Domain      = $comp.Domain
      Environment = $comp.Environment
      VIC         = $comp.VIC
    }
    Export-Csv ...
  }
} | ...

或者,正如@mjolinor建议的那样,您可以使用foreach循环:

foreach ($comp in ...) {
  try {
    Restart-Computer -ComputerName $comp.Servername ...
  } catch [System.Exception] {
    #Create output object
    $output = [PsCustomObject] @{
      Servername  = $comp.Servername
      Domain      = $comp.Domain
      Environment = $comp.Environment
      VIC         = $comp.VIC
    }
    Export-Csv ...
  }
}

foreach循环的缺点是,如果不将循环放在子表达式中或者先将其输出赋值给变量,就不能将其输出传递给管道。

相关问题