none
PoSh: Отключение сообщения об ошибке RRS feed

  • Вопрос

  • есть скрипт...

    ------------------------------------------------------
    param ([int]$start, [int]$end = $start)
    [string]$range = '192.168.111.'

    function GetWmiClass {
        param ( $target = "" )
        if ($wmi = Get-WmiObject -Class Win32_ComputerSystem -ComputerName $comp -ErrorAction SilentlyContinue -Authentication Call) { return $wmi }
        else { return $false }
    }

    $num = $start
    while ($num -le $end) {
        $comp = $range + $num
        Write-Host $comp":`t`t" -NoNewline -ForegroundColor Gray
          if (Test-Connection -ComputerName $comp -Quiet -Count 1) {
            If ($wmi = GetWmiClass $comp ) {
                Write-Host $wmi.Name"`t`t" -NoNewline -ForegroundColor DarkGreen
                if ($wmi.UserName) { Write-Host $wmi.UserName -ForegroundColor DarkGreen }
                else { Write-Host "Вход не выполнен"  -ForegroundColor DarkGray }
            }
            else {
                Write-Host "Ошибка доступа к WMI" -ForegroundColor DarkRed
            }
          }
        else { Write-Host "Хост не доступен" -ForegroundColor DarkGray }
        $num++
    }
    -----------------------------------------

    на некоторых хостах видим

    -----------------------------------------
    Get-WmiObject : Отказано в доступе. (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED))
    D:\dev.scripts\getusers.ps1:6 знак:26
    +     if ($wmi = Get-WmiObject <<<<  -Class Win32_ComputerSystem -ComputerName $comp -ErrorAction SilentlyContinue -Authentication Call) { return $wmi }
        + CategoryInfo          : NotSpecified: (:) [Get-WmiObject], UnauthorizedAccessException<br/>
        + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.GetWmiObjectCommand
    -----------------------------------------

    как сделать чтоб ошибка не выводилась в консоль при выполнении скрипта?

    -ErrorAction SilentlyContinue указано, но ошибка всё равно прёт

    эээ...
    22 января 2010 г. 14:48

Ответы

  • Во-первых я испробовал get-wmiobject во всех комбинациях, и с 1.0 и с 2.0, с различными типами ошибок, но при -erroraction silentlycontinue ошибка не выводится. Вы можете отключить вывод ошибок глобально, установив для переменной $ErrorActionPreference значение silentlyContinue
    Во-вторых, успешность команды лучше проверять не по наличию данных, а с помощью специальной переменной $? в которой содержится статус выполнения предыдущей команды.


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    • Предложено в качестве ответа Vasily GusevModerator 23 января 2010 г. 6:35
    • Помечено в качестве ответа OlegKrikun 23 января 2010 г. 10:26
    23 января 2010 г. 6:33
    Модератор

Все ответы

  • Во-первых я испробовал get-wmiobject во всех комбинациях, и с 1.0 и с 2.0, с различными типами ошибок, но при -erroraction silentlycontinue ошибка не выводится. Вы можете отключить вывод ошибок глобально, установив для переменной $ErrorActionPreference значение silentlyContinue
    Во-вторых, успешность команды лучше проверять не по наличию данных, а с помощью специальной переменной $? в которой содержится статус выполнения предыдущей команды.


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    • Предложено в качестве ответа Vasily GusevModerator 23 января 2010 г. 6:35
    • Помечено в качестве ответа OlegKrikun 23 января 2010 г. 10:26
    23 января 2010 г. 6:33
    Модератор
  • Во-первых я испробовал get-wmiobject во всех комбинациях, и с 1.0 и с 2.0, с различными типами ошибок, но при -erroraction silentlycontinue ошибка не выводится. Вы можете отключить вывод ошибок глобально, установив для переменной $ErrorActionPreference значение silentlyContinue
    Во-вторых, успешность команды лучше проверять не по наличию данных, а с помощью специальной переменной $? в которой содержится статус выполнения предыдущей команды.


    решил тоже поэксперемтировать.
    для воспроизведения ошибки, возникающей у автора, использовал gwmi Win32_ComputerSystem -Impersonation Anonymous. Как ни станно, но при добавлении -ErrorAction SilentlyContinue, сообщение об ошибке действительно продолжает выводиться на экран, а, вот использование $ErrorActionPreference=silentlycontinue или trap{continue} приводит к желаемом резудьтату: сообщение об ошибке не выводится. Правда, не понятно - почему так происходит?
    PS Вопрос Василию;) Интересно, а как можно отключить вывод сообщения об ошибке, возникающей, например, в следствие выполнения следующей команды: 1/0 (т.е. поделить некое число на нуль). Мне никак не удалось это сделать - сообщение об ошибке все время выводится на экран.
    23 января 2010 г. 7:25
  • для воспроизведения ошибки, возникающей у автора, использовал gwmi Win32_ComputerSystem -Impersonation Anonymous. Как ни станно, но при добавлении -ErrorAction SilentlyContinue, сообщение об ошибке действительно продолжает выводиться на экран

    Попробовал так - действительно, на 1.0 -erroraction в таком случае не работает. Обоим срочно обновляться на 2.0 - там всё отлично :)

    Что касается 1/0, то хоть и пишется что это RunTime Exception, на самом деле ошибка обнаруживается еще при разборе скрипта. Для PowerShell слишком очевидно что деление на ноль приведет к ошибке :) При желании отсрочить обнаружение ошибки на этап выполнения, когда уже будут работать различные методы перехвата ошибок, следует использовать не очевидное деление на ноль, а сделать например так:
    1/$null
    Значение переменной $null парсеру не очевидно, так что он её пропустит, а ошибка случится на этапе выполнения :)
    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    23 января 2010 г. 8:08
    Модератор
  • > Попробовал так - действительно, на 1.0 -erroraction в таком случае не работает. Обоим срочно обновляться на 2.0 - там всё отлично :)

    Не угадал. У меня уже давно PoSh 2.0, правда на win xp sp3 ;) Если PoSh v 1.0 у тебя установлен на XP, то, получается версия PoSh здесь не причем, а, вот, версия ОС очень даже важна...

    PS > (get-host).version

    Major  Minor  Build  Revision
    -----  -----  -----  --------
    2      0      -1     -1


    >Что касается 1/0, то хоть и пишется что это RunTime Exception, на самом деле ошибка обнаруживается еще при разборе скрипта.

    Действительно, похоже, что именно так и есть. Спасибо, мне это даже в голову не пришло.
    ... но, тогда получается, что это действительно совсем не RunTime Exception...
    23 января 2010 г. 9:24
  • Во-первых я испробовал get-wmiobject во всех комбинациях, и с 1.0 и с 2.0, с различными типами ошибок, но при -erroraction silentlycontinue ошибка не выводится. Вы можете отключить вывод ошибок глобально, установив для переменной $ErrorActionPreference значение silentlyContinue

    ну ошибку когда класса вообще на данном хосте нету " -erroraction silentlycontinue" замечательно скрывает, а вот E_ACCESSDENIED нет =)

    Вставка в скрипт $ErrorActionPreference = "SilentlyContinue" помогло, Спасибо!

    Во-вторых, успешность команды лучше проверять не по наличию данных, а с помощью специальной переменной $? в которой содержится статус выполнения предыдущей команды.
    а можно поподробнее? =) не понял что то...
    эээ...
    23 января 2010 г. 10:26
  • >Не угадал. У меня уже давно PoSh 2.0, правда на win xp sp3 ;) Если PoSh v 1.0 у тебя установлен на XP, то, получается версия PoSh здесь не причем, а, вот, версия ОС очень даже важна...

    Да, действительно, 1.0 у меня на XP. Кстати Get-Host возвращает версию хоста, которая вовсе не всегда совпадает с версией PowerShell. Версию PS надо смотреть в $PSVersionTable.psversion


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    23 января 2010 г. 10:37
    Модератор
  • Не
    If ($wmi = GetWmiClass $comp ) {
    а
    $wmi = GetWmiClass $comp
    if ($?) {


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    23 января 2010 г. 10:39
    Модератор
  • $wmi = GetWmiClass $comp
    if ($?) {

    а чем лучше? быстрее? или просто "правильнее"? =)

    эээ...
    23 января 2010 г. 10:42
  • Правильнее. Get-WmiObject может вполне успешно отработать не вернув ни одного объекта. А может наоборот вернуть несколько объектов, и одновременно выдать ошибку. В конкретном случае возврат объекта конечно эквивалентен успешному выполнению, но привычку лучше вырабатывать правильную ;)


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    23 января 2010 г. 10:46
    Модератор
  • Правильнее. Get-WmiObject может вполне успешно отработать не вернув ни одного объекта. А может наоборот вернуть несколько объектов, и одновременно выдать ошибку. В конкретном случае возврат объекта конечно эквивалентен успешному выполнению, но привычку лучше вырабатывать правильную ;)

    Вас, понял =) ещё раз спасибо за потраченное время =)

    эээ...
    23 января 2010 г. 10:48