我正在使用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" } } }
编辑:修复
我最终得到了一些与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" } } } }