-ErrorAction默默无闻地继续工作

我正在使用PowerShell,我正在从C#调用脚本。 我试图从不同的服务器复制日志,

foreach($server in $args) { $destination = "\\$server\$path" if(!(Test-Path $destination)) { New-Item -ItemType directory -Path $destination } foreach($log in $logsTaskAgent) { Write-Host "Backup $log log $server" $filename = "{0}{1}_{2}_{3}.evt" -f $destination,$server,$log,$date Write-Host "Filename: $filename" if($password -and $userName) { $logFile = Get-WmiObject Win32_NTEventlogFile -ComputerName $server -Credential $credential -ErrorAction SilentlyContinue | where-object { $_.logfilename -eq $log } Write-Output "continue" if($logFile) { $logFile.PSBase.Scope.Options.EnablePrivileges = $true $logFile.backupeventlog($filename) } else { Write-Output "Error on server: $server for log: $log" } } } 

这完美的工作,但是当凭证发生问题时,它会抛出一个exception,但我想继续,因为我说过,我有很多服务器,所以我只是想忽略exception,并继续与其他服务器的任何错误的想法? 据我了解–ErrorAction无声继续应该做的伎俩,但它不是:(

编辑:修复

我最终得到了一些与Johan de Haan的答案非常相似的东西,所以我将这个答案作为答案…下面是修改后的代码:

 foreach($server in $args) { try { $destination = "\\$server\$path" if(!(Test-Path $destination)) { New-Item -ItemType directory -Path $destination } foreach($log in $logsTaskAgent) { Write-Host "Backup $log log $server" $filename = "{0}{1}_{2}_{3}.evt" -f $destination,$server,$log,$date Write-Host "Filename: $filename" if($password -and $userName) { $logFile = Get-WmiObject Win32_NTEventlogFile -ComputerName $server -Credential $credential -ErrorAction SilentlyContinue | where-object { $_.logfilename -eq $log } Write-Output "continue" if($logFile) { $logFile.PSBase.Scope.Options.EnablePrivileges = $true $logFile.backupeventlog($filename) } else { Write-Output "Error on server: $server for log: $log" } } } } catch { Write-Output "Error while retrieving log Object from server $server : $($_.Exception.Message)" continue } $destination = "" } 

我会使用try / catch并使用中断来继续下一个服务器:

 foreach($server in $args){ $destination = "\\$server\$path" if(!(Test-Path $destination)) { New-Item -ItemType directory -Path $destination } foreach($log in $logsTaskAgent) { Write-Host "Backup $log log $server" $filename = "{0}{1}_{2}_{3}.evt" -f $destination,$server,$log,$date Write-Host "Filename: $filename" if($password -and $userName) { try{ $logFile = Get-WmiObject Win32_NTEventlogFile -ComputerName $server -Credential $credential -ErrorAction Stop | where-object { $_.logfilename -eq $log } } catch { Write-Warning "Error while retrieving WMI Object: $($_.Exception.Message)" break #this way you break out of the first loop, continuing in the foreach ($server in args loop) } Write-Output "continue" if($logFile) { $logFile.PSBase.Scope.Options.EnablePrivileges = $true $logFile.backupeventlog($filename) } else { Write-Output "Error on server: $server for log: $log" } } } }