Запись в поток ошибок в Powershell с использованием Write-Error - PullRequest
14 голосов
/ 11 марта 2011

Почему командлет Powershell Write-Error не работает для меня?Мой вывод не похож на примеры в документации:

PS C:\> Write-Error "This is an error"
Write-Error "This is an error" : This is an error
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException

Я ожидал вывод, похожий на Write-Warning:

PS H:\> Write-Warning "This is a warning"
WARNING: This is a warning

ИзWrite-Error и about_preference_variables документация Я думал, что не должен видеть никаких исключений?

PS H:\> Get-Help About_Preference_Variables

$ErrorActionPreference
----------------------

...

        PS> $erroractionpreference                      
        Continue        # Display the value of the preference.                

        PS> write-error "Hello, World"                  
                                # Generate a non-terminating error.

        write-error "Hello, World" : Hello, World       
                                # The error message is displayed and
                                  execution continues.

        PS> write-error "Hello, World" -ErrorAction:SilentlyContinue
                                # Use the ErrorAction parameter with a 
                                  value of "SilentlyContinue".
        PS>                                             
                                # The error message is not displayed and
                                  execution continues.

Ответы [ 3 ]

16 голосов
/ 13 апреля 2011

Чтобы получить вывод, похожий на предупреждение о записи, вы можете сделать это:

$Host.UI.WriteErrorLine("This is an error")

(ответит Крису Сирсу за этот ответ)

6 голосов
/ 11 марта 2011

Почему вы не думаете, что это работает? Имейте в виду, что PowerShell различает не прекращающиеся ошибки, подобные предыдущей, и завершающие ошибки, которые вы получаете при выполнении throw 'Access denied.'. Не завершающие ошибки записываются в stderr и записываются в коллекцию $ error, но они не останавливают обработку скрипта. Эта функция очень удобна, когда вы обрабатываете (например, удаляете или копируете) кучу файлов. Вы хотите знать, какие файлы не могут быть обработаны, но не хотите, чтобы вся операция остановилась на первом файле, который выдает ошибку.

PowerShell также дает вам возможность «преобразовывать» не прекращающиеся ошибки в завершающие ошибки, например,

Remove-Item c:\file-doesnt-exist -ErrorAction Stop; "Did I get here"

Обратите внимание, что в этом случае выполнение останавливается и не выводит строку в конце. Попробуйте без -ErrorAction Stop, и вы увидите ошибку, но вы также увидите строку «Я сюда попал».

Если вы хотите управлять информацией о Catogory, вы можете использовать параметр -Category следующим образом:

PS> write-error "foo" -Category 'InvalidResult'
write-error "foo" -Category 'InvalidResult' : foo
    + CategoryInfo          : InvalidResult: (:) [Write-Error], WriteErrorExce..
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException

Но WriteErrorException - это механизм (я думаю), с помощью которого этот командлет вызывает ошибку. Есть параметр Exception, но мне не очень повезло с его использованием.

3 голосов
/ 11 марта 2011

Я полагаю, вы видите ожидаемый результат от этого командлета. Вы вводите «Доступ запрещен». аргумент, и он выводит это на хост и, скорее всего, на поток ошибок, как и планировалось. Вы можете подтвердить, что он выводится в переменную $ Error, и он должен быть заполнен только что вставленной ошибкой.

т.е.

PS C:\> $error.Clear()

PS C:\> Write-Error "access denied"

Write-Error "access denied" : access denied

    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException

PS C:\> $error

Write-Error "access denied" : access denied

    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException

Я могу видеть, где это может сбить с толку, хотя, возможно, MSFT должен изменить пример ошибки с что-то вроде «Отказано в доступе» на «Foobar» для ясности.

Изменить для решения следующего вопроса: По умолчанию errorAction для Write-Error имеет значение «continue», поэтому, чтобы заставить его вести себя как Write-Warning, вам нужно добавить -ErrorAction SilentlyContinue. Рассмотрим следующий пример:

PS E:\> $error.clear()
PS E:\> Write-Error 'test'
Write-Error 'test' : test
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException

PS E:\> Write-Error 'test2' -ErrorAction silentlycontinue  

PS E:\> $error[1]
Write-Error 'test' : test
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException

PS E:\> $error[0]
Write-Error 'test2' -ErrorAction silentlycontinue : test2
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...