none
PowerShell Обработка ошибок RRS feed

  • Вопрос

  • Коллеги, здравствуйте.

    Нужна ваша консультация, не могу сам разобраться.

    Есть скрипт, который берет список рабочих станций, и проверяет состав группы "Администраторы" на этих компьютерах.

    В принципе состав скрипта уже есть, но мне надо отлавливать ошибки при выполнении этого скрипта.

    Вот, собственно, сам скрипт:

    $comp_list = Import-Csv -Path C:\comp_list.txt
    
    $groupsid="S-1-5-32-544"
    $devider="==============================================================="
    foreach ($computer in $comp_list)
    {
     $devider | Out-File c:\hbr1.txt -append
     $computerName=$($computer.name)
     $comp=get-adcomputer -identity "$computerName" | Select-Object name -ExpandProperty name
     $comp | Out-File c:\hbr1.txt -append
     $comp
     $devider | Out-File c:\hbr1.txt -append
     Trap {Write-Host "Error WMI $Comp";Continue}
     $group=Get-WmiObject win32_group -ComputerName $Comp |  Where-Object {$_.SID -eq $GroupSID} |  Select-Object name -ExpandProperty name
     Trap {Write-Host "Error ADSI $Comp";Continue}
     $Users = ([ADSI]"WinNT://$Comp/$Group").psbase.invoke("Members") |   % {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}
     $users | Out-File c:\hbr1.txt -append
     $devider | Out-File c:\hbr1.txt -append
     
    
    }

    С какой проблемой столкнулся: при опросе не все компьютеры оказываются доступны, не у всех бывают открыты порты в фаерволе... Как бы то ни было скрипт генерит ошибку и в мой выходной файл начинает валится ненужный мусор. Что бы этого избежать вставил в код "ловушки" (Google подсказал). Насколько я понял механизм "ловушек", если случается какая-либо ошибка после Trap-а, то выполнение команды прерывается и происходит переход к следующей итерации.

    Что по факту происходит у меня. Идет итерация, все команды выполняются успешно и в переменную $group записываются нужные данные. Начинается следующая итерация (компьютер не доступен), инструкция

    $group=Get-WmiObject win32_group -ComputerName $Comp

    завершается ошибкой и в переменной $group остаются данные от предыдущей успешной итерации, что приводит к некорректным данным в выходном файле.

    Что я не правильно делаю? Может я чего-то не понимаю?


    11 июля 2014 г. 1:10

Ответы

  • Использовать try-catch:

    try {
    	$group = Get-WmiObject win32_group -ComputerName $Comp -ErrorAction Stop
    	$Users = ([ADSI]"WinNT://$Comp/$Group").psbase.invoke("Members") |   % {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}
    	$users | Out-File c:\hbr1.txt -append
    	$devider | Out-File c:\hbr1.txt -append
    }
    catch {
    	"ERROR: $Comp : $_" | Add-Content errors.txt
    }

    • Предложено в качестве ответа Vector BCOModerator 11 июля 2014 г. 9:29
    • Помечено в качестве ответа KazunEditor 17 июля 2014 г. 5:09
    11 июля 2014 г. 8:38
    Отвечающий