Меню

Powershell убрать вывод ошибок

  • Remove From My Forums
  • Вопрос

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

    ——————————————————
    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.scriptsgetusers.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 указано, но ошибка всё равно прёт


    эээ…

Ответы

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


    AKA Xaegr, MCSE: Security, Messaging; MCITP: ServerEnterprise Administrator; Блог: http://xaegr.wordpress.com

    • Предложено в качестве ответа

      23 января 2010 г. 6:35

    • Помечено в качестве ответа
      OlegKrikun
      23 января 2010 г. 10:26

  1. Introduction to Error Action in PowerShell
  2. Use the -ErrorAction Parameter in PowerShell
  3. Setting Error Action Preferences in PowerShell

Suppressing PowerShell Errors

Whether we want to ignore error messages or terminate a script’s execution when an error occurs, Windows PowerShell has plenty of options for dealing with errors. This article will discuss multiple techniques in handling and suppressing errors.

Introduction to Error Action in PowerShell

Even though it is effortless to suppress Windows PowerShell errors, doing so isn’t always the best option (although it can be). If we carelessly tell PowerShell to hide errors, it can cause our script to behave unpredictably.

Suppressing error messages also makes troubleshooting and information gathering a lot more complicated. So tread lightly and be careful about using the following snippets that you will see in this article.

Use the -ErrorAction Parameter in PowerShell

The most common method for dealing with errors is to append the -ErrorAction parameter switch to a cmdlet. The -ErrorAction parameter switch lets PowerShell tell what to do if the cmdlet produces an error.

Command:

Get-Service 'svc_not_existing' -ErrorAction SilentlyContinue

In the command above, we are querying for a service that doesn’t exist. Usually, PowerShell will throw an error if the service doesn’t exist.

Since we use the -ErrorAction parameter, the script will continue as expected, like it doesn’t have an error.

Setting Error Action Preferences in PowerShell

If we need a script to behave in a certain way (such as suppressing errors), we might consider setting up some preference variables. Preference variables act as configuration settings for PowerShell.

We might use a preference variable to control the number of history items that PowerShell retains or force PowerShell to ask the user before performing specific actions.

For example, here is how you can use a preference variable to set the -ErrorAction parameter to SilentlyContinue for the entire session.

Command:

$ErrorActionPreference = 'SilentlyContinue'

There are many other error actions that we can specify for the ErrorAction switch parameter.

  • Continue: PowerShell will display the error message, but the script will continue to run.
  • Ignore: PowerShell does not produce any error message, writes any error output on the host, and continues execution.
  • Stop: PowerShell will display the error message and stop running the script.
  • Inquire: PowerShell displays the error message but will ask for confirmation first if the user wants to continue.
  • SilentlyContinue: PowerShell silently continues with code execution if the code does not work or has non-terminating errors.
  • Suspend: PowerShell suspends the workflow of the script.

As previously mentioned, the -ErrorAction switch has to be used in conjunction with a PowerShell cmdlet. For instance, we used the Get-Process cmdlet to demonstrate how the ErrorAction switch works.

Powershell ErrorAction это ключ, с помощью которого мы можем обходить часть ошибок. Это помогает остановить скрипт, если будет ошибка. 

У меня есть две директории, одна которая существует, а другая нет. Если я выполню поиск файлов, то скрипт выведет ошибку:

$path = 'C:NotExist','C:Exist'
$path | Get-ChildItem

Get-ChildItem : Cannot find path ‘C:NotExist’ because it does not exist.

Что бы этого избежать у нас есть ключ ErrorAction со следующими значениями:

  • Continue или 0 — значение по умолчанию. Ошибка выводится на экран, но работа скрипта продолжается.
  • SilentlyContinue или 1 — ошибка не выводится на экран и скрипт продолжает работу.
  • Stop или 2 — останавливает выполнение при ошибке.
  • Ignore или 3 — игнорирует ошибки и при этом никакие логи об ошибке не сохраняются.
  • Inquire — с этим ключом у нас будет запрос на дальнейшее действия.
  • Suspend — работает при режиме Workflow (рабочих процессов). К обычным командлетам не имеет отношения.

Пример со значением по умолчанию:

$services = "NotExist","NetLogon"
$services | Get-Service -ErrorAction Continue

Powershell ErrorAction

В случае с SilentContinue у нас ошибок не будет:

Get-Process -Name "NotExist","svchost" -ErrorAction SilentlyContinue

Powershell SilentlyContinue

При этом, конечно, ключ мы должны указывать везде где ожидаем увидеть ошибку:

Powershell ошибка

Если мы выполним такую команду, то все равно получим ошибку, которая остановит процесс:

Get-Variable -Name $null -ErrorAction SilentlyContinue

Это ошибка, которая прерывает процесс и для нее нужно использовать другие методы в виде try и catch.

Теги:

#powershell

Здесь ты сбился с пути.

У вас уже есть большое красивое сообщение об ошибке. Зачем вам писать код, который проверяет $? явно после каждая команда? Это чрезвычайно громоздко и подвержено ошибкам. Правильное решение прекратить проверку $?.

Вместо этого используйте встроенный механизм PowerShell, чтобы взорвать вас. Вы включаете его, устанавливая предпочтение ошибки на высший уровень:

$ErrorActionPreference = 'Stop'

Я помещаю это в начало каждого скрипта, который когда-либо писал, и теперь мне не нужно проверять $?. Это делает мой код намного проще и надежнее.

Если вы столкнетесь с ситуациями, когда вы на самом деле необходимо отключить это поведение, вы можете либо catch ошибку или передать настройку определенной функции, используя общий -ErrorAction. В вашем случае вы, вероятно, хотите, чтобы ваш процесс остановился при первой ошибке, перехватил ошибку, а затем зарегистрировал ее.

Обратите внимание, что это не относится к случаю, когда внешние исполняемые файлы терпят неудачу (обычно код выхода ненулевой), поэтому вам все равно нужно проверить $LASTEXITCODE если вы вызовете какой-либо. Несмотря на это ограничение, настройка по-прежнему позволяет сэкономить много кода и усилий.

Дополнительная надежность

Вы также можете рассмотреть возможность использования строгий режим:

Set-StrictMode -Version Latest

Это препятствует тому, чтобы PowerShell продолжал молча, когда вы используете несуществующую переменную и в других странных ситуациях. (См. -Version параметр для получения подробной информации о том, что он ограничивает.)

Сочетание этих двух параметров делает PowerShell более отказоустойчивым языком, что значительно упрощает программирование на нем.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Powershell скрыть вывод ошибок
  • Powershell продолжить выполнение скрипта при ошибке