Ошибка записи PowerShell
Я кодировал простую функцию журнала, которая вызывает командлет Write-Error
, Однако это приводит к неожиданному поведению. Чтобы дать вам пример:
function foo {
Param([string]$Msg = "This is an error")
Write-Error $Msg
}
призвание foo
результаты в следующем:
foo: это ошибка В строке:1 символ:1 + фу
Итак, кажется, что зовет foo
(и командлет Write-Error
в нем), выдает ошибку, что PS ссылается на функцию foo
сам.
Как правильно написать сообщение в поток ошибок PS, но не выглядеть как ошибка в вызывающей функции?
Я нашел ответ: разница немного тонкая: есть разница между выдачей ошибки и выводом сообщений об ошибках в стандартный поток ошибок. В структуре try/catch выбрасывание ошибки приведет к переходу в блок catch. При использовании write-error
в блоке try будет просто направлять вывод в стандартный поток ошибок. Следующая функция не войдет в блок catch. Однако он записывает сообщение об ошибке "Hey" в переменную $error и оставляет все остальные атрибуты пустыми.
function myErr { try { write-error "Hey" } catch { write-host "Ups" } }
Сообщение об ошибке, однако, покажет, что ошибка произошла в myErr
в строке 1, символ 1.
Итак, я вижу, что это кажется стандартным поведением при вызове write-error
, я использую write-output
затем.
1 ответ
Вместо этого:
function foo {
Param([string]$Msg = "This is an error")
Write-Error $Msg
}
Используйте для этого запись-вывод. Это нормальное поведение ошибки записи в PS:
function foo {
Param([string]$Msg = "This is an error")
Write-Output $Msg
}