我在使用重启脚本时遇到问题。我试图向一系列服务器发送一个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块,所以我无法将它们写入“重试列表”。任何人都可以想到一种有效的方法吗?
答案 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
循环的缺点是,如果不将循环放在子表达式中或者先将其输出赋值给变量,就不能将其输出传递给管道。