Powershell вывод ошибок в файл
Объясняется, как перенаправлять выходные данные из PowerShell в текстовые файлы.
Подробное описание
Для перенаправления выходных данных можно использовать следующие методы:
Out-File Используйте командлет, который отправляет выходные данные команды в текстовый файл. Как правило, командлет используется Out-File , когда необходимо использовать параметры, такие как Encoding , Force Width , или NoClobber .
Tee-Object Используйте командлет, который отправляет выходные данные команды в текстовый файл и отправляет его в конвейер.
Используйте операторы перенаправления PowerShell. Использование оператора перенаправления с целевым объектом файла функционально эквивалентно конвейеру Out-File без дополнительных параметров.
Дополнительные сведения о потоках см. в разделе about_Output_Streams.
Асинхронное выполнение
Конвейер Powershell передает значения асинхронно. Это значит, что несколько функций будут работать друг с другом еще до завершения своей работы. Это так же может быть важно в отдельных случаях.
В примере ниже видно, что мы передаем значения из массива постепенно, а не целиком. У нас чередуется выполнение функций (a,b,a. ):
Критические ошибки (Terminating Errors)
Критические (завершающие) ошибки останавливают работу скрипта. Например это может быть ошибка в названии командлета или параметра. В следующем примере команда должна была бы вернуть процессы "svchost" дважды, но из-за использования несуществующего параметра '--Error' не выполнится вообще:
Параметр ErrorVariable
Если вы не хотите использовать автоматическую переменную $Error, то сможете определять свою переменную индивидуально для каждой команды. Эта переменная определяется в параметре ErrorVariable:
Переменная будет иметь те же свойства, что и автоматическая:
Повторное использование логина и пароля в Powershell с Get-Credential и их шифрование
Пример 1. ошибки перенаправления и выходные данные в файл
Этот пример выполняется dir на одном элементе, который будет выполнен, и один из которых будет иметь ошибку.
Он использует 2>&1 для перенаправления потока ошибок в поток успешного выполнения и > отправки результирующего потока успешного выполнения в файл с именем. dir.log
Перенаправляемые выходные потоки
PowerShell поддерживает перенаправление следующих выходных потоков.
В PowerShell также присутствует поток хода выполнения , но он не поддерживает перенаправление.
Потоки успехов и ошибок похожи на потоки stdout и stderr других оболочек. Однако stdin не подключен к конвейеру PowerShell для ввода данных.
hashtable
Не все объекты Powershell могут проходить через конвейер. Как написано в документации у всех типов Powershell, кроме hashtable, есть поддержка работы через конвейеры (IEnumerable). При попытке пропустить хэш-таблицу через конвейер возникнет ошибка:
- Get-Service : Не удается найти службу с именем службы "System.Collections.Hashtable".
Параметр "ErrorAction" нужен т.к. у нас произойдет ошибка из-за ключа 'State'. Значения хэш таблицы передаются не как целый массив (как в случае с PSCustomObject), а по отдельности. Сначала передается ключ 'Name' со значением 'WinRM', а затем 'State' со значением 'Restarted'.
Еще два способа получить только ключи или только значения:
Использование Write-Error
Команда Write-Error работает так же, как и ключ ErrorAction. Мы можем просто отобразить какую-то ошибку и продолжить выполнение скрипта:
При необходимости мы можем использовать параметр ErrorAction. Значения этого параметра были описаны выше. Мы можем указать значение 'Stop', что полностью остановит выполнение скрипта:
Отличие команды Write-Error с ключом ErrorAction от обычных команд в том, что мы можем указывать исключения в параметре Exception:
Ключевой особенностью Powershell, которая отличает его от других языков, это работа с конвейером. Дело в том, что каждая команда в Powershell возвращает множество объектов, а не один объект типа строка. Такой метод дает дополнительные возможности для работы с языком. Конвейер так же называют pipe или pipeline. В это статье будут рассмотрены примеры работы конвейера, его сравнение с bash, отличие от циклов и создание функции принимающей данные с конвейера.
Навигация по посту
Пример 3. Передача в файл успешных, предупреждающих и ошибочных потоков
В этом примере показано, как можно комбинировать операторы перенаправления для достижения желаемого результата.
- 3>&1 перенаправляет поток предупреждений в поток успешного выполнения .
- 2>&1 перенаправляет поток ошибок в поток успешного выполнения (который также включает все данные потока предупреждений ).
- > перенаправляет поток успешного выполнения (который теперь содержит потоки предупреждений и ошибок ) в файл с именем C:\temp\redirection.log ).
Пример 5. Отключение всех данных Write-Host и информационных потоков
В этом примере подавляются все данные потока информации. Дополнительные сведения о командлетах информационного потока см. в статье Write-Host и Write-Information .
Как работает конвейер
Конвейер (pipline, pipe) - это возможность, которая позволяет удобно обменяться данными между командами. В большинстве языков пайплайн определяется символом '|'. Значения, которые указаны в левой части, передаются на чтения справа.
Если бы мы использовали конвейер с буквами, то получилось бы следующее:
В примере ниже слева указана строка, которая выводится через команду справа:
Предыдущий пример идентичен, по функциональности и результату, следующему выполнению:
Суть в том, что мы можем указать несколько значений в левой части. Каждое из этих значений будет передаваться асинхронно (т.е. отдельно). Значения, которые разделяются запятыми в Powershell, образуют массив:
В командах без конвейера мы редко можем использовать массивы в качестве значений. Что бы получить результат аналогичный предыдущей команде мы должны вызвать ее дважды:
Учитывая, что Powershell называют языком команд (или сценариев), нам просто удобнее использовать конвейер совмещая несколько команд. Чаще всего он используется в связке с "Select-Object" (выбор 'колонки') и/или с "Where-Object" (условие).
Так мы получим только день из сегодняшней даты:
Обработка критических ошибок и исключений с Try, Catch и Finally
Когда мы ожидаем получить какую-то ошибку и добавить логику нужно использовать Try и Catch. Например, если в вариантах выше мы определяли нужно ли нам отображать ошибку или останавливать скрипт, то теперь сможем изменить выполнение скрипта или команды вообще. Блок Try и Catch работает только с критическими ошибками и в случаях если $ErrorActionPreference или ErrorAction имеют значение Stop.
Например, если с помощью Powershell мы пытаемся подключиться к множеству компьютеров один из них может быть выключен - это приведет к ошибке. Так как эту ситуацию мы можем предвидеть, то мы можем обработать ее. Процесс обработки ошибок называется исключением (Exception).
Синтаксис и логика работы команды следующая:
Блок try мониторит ошибки и если она произойдет, то она добавится в переменную $Error и скрипт перейдет к блоку Catch. Так как ошибки могут быть разные (нет доступа, нет сети, блокирует правило фаервола и т.д.) то мы можем прописывать один блок Try и несколько Catch:
Сам блок finally - не обязательный и используется редко. Он выполняется самым последним, после try и catch и не имеет каких-то условий.
Потенциальная путаница с операторами сравнения
> Оператор не следует путать с оператором сравнения " больше " (часто обозначается как > в других языках программирования).
В зависимости от сравниваемых объектов выходные данные > могут выглядеть правильными (поскольку 36 не превышает 42).
Однако проверка локальной файловой системы может видеть, что файл с именем 42 был записан с содержимым 36 .
Попытка использовать обратные сравнения < (меньше) приводит к системной ошибке:
Значение, -lt Если числовое сравнение является обязательной операцией и -gt должно использоваться. Дополнительные сведения см. в описании -gt оператора в about_Comparison_Operators.
В Powershell существует несколько уровней ошибок и несколько способов их обработать. Проблемы одного уровня (Non-Terminating Errors) можно решить с помощью привычных для Powershell команд. Другой уровень ошибок (Terminating Errors) решается с помощью исключений (Exceptions) стандартного, для большинства языков, блока в виде Try, Catch и Finally.
Навигация по посту
Example 6: Show the effect of Action Preferences
Action Preference variables and parameters can change what gets written to a particular stream. The script in this example shows how the value of $ErrorActionPreference affects what gets written to the Error stream.
When we run this script we get prompted when $ErrorActionPreference is set to Inquire .
When we examine the log file we see the following:
Примеры
Redirectable output streams
PowerShell supports redirection of the following output streams.
There is also a Progress stream in PowerShell, but it does not support redirection.
The Success and Error streams are similar to the stdout and stderr streams of other shells. However, stdin is not connected to the PowerShell pipeline for input.
Различия с циклом
Пайп схож с циклами, но более автоматизирован. Что бы с помощью цикла получить название дисков, а затем изменить цвет вывода, мы должны сделать следующее:
У нас использован совершенно обычный цикл, который есть во всех языках. Мы объявляем переменную "$item", в которую помещается временное значение. Это значение мы отдельно выводим. Т.е. мы выполняем 3 действия:
- Объявление цикла;
- Объявление переменной с текущим значением;
- Вывод переменной (или другие действия, например сохранение данных в файл).
В Powershell реализован так же команда-цикл "ForEach-Object". Особенность этой команды в том, что используется только часть возможности конвейера и часть от обычного цикла:
Как можно увидеть с примера выше у нас исчез шаг под номером 2. Мы больше не объявляем временную переменную - она формируется автоматически под именем "PSItem". Эта переменная появляется во время передачи данных через pipeline. В нее помещается результат работы "Get-PSDrive".
Конвейер убирает еще, как минимум, один шаг. Нам не нужно объявлять цикл - мы просто вызываем переменную:
В некоторых случаях мы можем не указывать "PSItem" вовсе. Обычно это команды одного типа, например, работы с сервисом:
Конвейер - отличный выбор когда вам нужно сделать что-то единожды. Если вы пишете скрипт, а тем более используете 'where-object' на больших данных, всегда лучше использовать циклы. Это будет работать быстрее.
Пример 2. Отправка всех успешных данных потока в файл
В этом примере все успешные потоковые данные отправляются в файл с именем script.log .
Выброс с throw
Throw - выбрасывает ошибку, которая останавливает работу скрипта. Этот тип ошибок относится к критическим. Например мы можем указать только текст для дополнительной информации:
Если нужно, то мы можем использовать исключения, которые уже были созданы в Powershell:
Ширина выходных данных при записи в файл
При записи в файл с помощью Out-File или операторов перенаправления PowerShell преобразует выходные данные таблицы в файл на основе ширины консоли, в которой она выполняется. Например, при записи выходных данных таблицы в файл с помощью команды, например Get-ChildItem Env:\Path > path.log в системе, в которой ширина консоли равна 80 столбцам, выходные данные в файле усекаются до 80 символов:
Учитывая, что ширина консоли может быть задана произвольным образом на системах, где выполняется сценарий, вы можете предпочесть, чтобы формат PowerShell был выводить файлы таблицы в соответствии с заданной заданной шириной.
Out-File Командлет предоставляет параметр Width , позволяющий задать ширину для вывода в таблицу. Вместо того, чтобы добавлять -Width 2000 все при вызове Out-File , можно использовать $PSDefaultParameterValues переменную, чтобы задать это значение для всех использований Out-File командлета в скрипте. А поскольку операторы перенаправления ( > и >> ) фактически являются псевдонимами для Out-File , установка Out-File:Width параметра для всего скрипта влияет также на ширину форматирования для операторов перенаправления. Добавьте следующую команду в начало скрипта, чтобы задать Out-File:Width для всего скрипта:
Увеличение ширины выходных данных приведет к увеличению потребления памяти при регистрации выходных данных в табличном формате. Если вы записываете в файл большой объем табличных данных и вы уверены, что можете сделать это с меньшей шириной, используйте меньшую ширину.
В некоторых случаях, например Get-Service в выходных данных, чтобы использовать дополнительную ширину, необходимо передать выходные данные Format-Table -AutoSize перед выводом в файл.
Дополнительные сведения о $PSDefaultParameterValues см. в разделе about_Preference_Variables.
Обработка некритических ошибок
У нас есть два способа определения последующих действий при 'Non-Terminating Errors'. Это правило можно задать локально и глобально (в рамках сессии). Мы сможем полностью остановить работу скрипта или вообще отменить вывод ошибок.
Массивы
Вы наверняка использовали команды, которые позволяют использовать следующую конструкцию:
Используя примеры выше у вас не получится организовать такую возможность. У вас появится ошибка в первом случае т.к. ожидается число, а вы передаете массив:
- Не удается обработать преобразование аргументов для параметра "param". Не удается преобразовать значение.
Если вам нужно передавать именованные параметры, то нужно будет организовывать дополнительные проверки. Я не рекомендую использовать такие сложные конструкции.
Пример 4. перенаправление всех потоков в файл
Этот пример отправляет все выходные данные из скрипта, вызываемого script.ps1 в файл с именем script.log
Пример 4. перенаправление всех потоков в файл
Этот пример отправляет все выходные данные из скрипта, вызываемого script.ps1 в файл с именем script.log
Пример 1. ошибки перенаправления и выходные данные в файл
Этот пример выполняется dir на одном элементе, который будет выполнен, и один из которых будет иметь ошибку.
Он использует 2>&1 для перенаправления потока ошибок в поток успешного выполнения и > отправки результирующего потока успешного выполнения в файл с именем. dir.log
Примечания
Операторы перенаправления, которые не добавляют данные ( > и n> ) перезаписывают текущее содержимое указанного файла без предупреждения.
Однако если файл доступен только для чтения, является скрытым или системным файлом, перенаправление завершается ошибкой. Операторы добавления перенаправления ( >> и n>> ) не записывают в файл, доступный только для чтения, но добавляют содержимое в системный или скрытый файл.
Для принудительного перенаправления содержимого в скрытый или системный файл только для чтения используйте Out-File командлет со своим Force параметром.
При записи в файлы операторы перенаправления используют UTF8NoBOM кодировку. Если файл имеет другую кодировку, выходные данные могут быть неправильно отформатированы. Для записи в файлы с другой кодировкой используйте Out-File командлет с его Encoding параметром.
Пример 6. Отображение влияния настроек действий
Переменные и параметры настройки действия могут изменять содержимое, записываемое в определенный поток. Скрипт в этом примере показывает, как значение $ErrorActionPreference влияет на то, что записывается в поток ошибок .
При выполнении этого скрипта выводится запрос, когда $ErrorActionPreference для Inquire параметра задано значение.
При изучении файла журнала мы увидим следующее:
Example 1: Redirect errors and output to a file
This example runs dir on one item that will succeed, and one that will error.
It uses 2>&1 to redirect the Error stream to the Success stream, and > to send the resultant Success stream to a file called dir.log
Создание функции работающей через Pipeline
Еще один способ понять работу конвейера - это создать собственную команду (функцию). Мы можем объявить два параметра, которые могут быть использованы вместе, так и отдельно:
- ValueFromPipeline - подразумевает, что вы передаете обычные массивы (например '1','2','3'). Этот параметр может быть установлен только один раз на функцию;
- ValueFromPipelineByPropertyName - принимает массив ключ-значение и ищет совпадающее свойство (ключ). Этот параметр можно использовать множество раз.
Эти параметры мы можем совмещать, так и указывать отдельно:
В отличие от предыдущего способа, ValueFromPipelineByPropertyName мы можем использовать множество раз. Самое главное использовать правильные названия переменных и ключей:
Мы можем комбинировать параметры ValueFromPipelineByPropertyName и ValueFromPipeline. Я бы рекомендовал избегать таких способов т.к. в них легко запутаться:
Обратите внимание на помеченные фрагменты. Мы должны определять тип данных, который ожидается (случай 1 и 2) иначе конвейер не будет обрабатывать некоторые данные корректно. Так же, в случае 3, у нас выводится только последний элемент. Это происходит из-за отсутствия Process.
Пример 2. Отправка всех успешных данных потока в файл
В этом примере все успешные потоковые данные отправляются в файл с именем script.log .
Потенциальная путаница с операторами сравнения
> Оператор не следует путать с оператором сравнения " больше " (часто обозначается как > в других языках программирования).
В зависимости от сравниваемых объектов выходные данные > могут выглядеть правильными (поскольку 36 не превышает 42).
Однако проверка локальной файловой системы может видеть, что файл с именем 42 был записан с содержимым 36 .
Попытка использовать обратные сравнения < (меньше) приводит к системной ошибке:
Значение, -lt Если числовое сравнение является обязательной операцией и -gt должно использоваться. Дополнительные сведения см. в описании -gt оператора в about_Comparison_Operators.
Explains how to redirect output from PowerShell to text files.
Пример 5. Отключение всех данных Write-Host и информационных потоков
В этом примере подавляются все данные потока информации. Дополнительные сведения о командлетах информационного потока см. в статье Write-Host и Write-Information .
Разница конвейеров bash и Powershell
Разница работы конвейеров в типе объектов, которые через них проходят. В Powershell, в подавляющем большинстве, возвращается (попадают в stdout) массивы следующего вида:
Благодаря этому мы можем сразу получать нужное свойство не использовав сложные конструкции и регулярные выражения:
Bash же отправляет в stdout информацию в виде строки:
Так как это сплошной текст - нам приходится использовать дополнительные механизмы для поиска нужных данных. Например grep:
Есть и другие отличия. Например в Powershell есть переменные, в которые и помещаются данные конвейера: $PSItem или $_. Часть из таких возможностей будет рассмотрена далее.
Подробное описание
Для перенаправления выходных данных можно использовать следующие методы:
Out-File Используйте командлет, который отправляет выходные данные команды в текстовый файл. Как правило, командлет используется Out-File , когда необходимо использовать параметры, такие как Encoding , Force Width , или NoClobber .
Tee-Object Используйте командлет, который отправляет выходные данные команды в текстовый файл и отправляет его в конвейер.
Используйте операторы перенаправления PowerShell. Использование оператора перенаправления с целевым объектом файла функционально эквивалентно конвейеру Out-File без дополнительных параметров.
Дополнительные сведения о потоках см. в разделе about_Output_Streams.
Блок Process
При создании функций в Powershell вы можете использовать блоки: begin, process и end. В большинстве случаев это не требуется и вы можете писать функцию по принципам описанным выше. В случае конвейеров эти блоки приобретают дополнительный смысл:
- begin - значение, переданное через конвейер, этому блоку не известно. Оно будет равно $null либо другому значению по умолчанию, которое вы установите;
- process - обрабатывает каждый элемент переданные через конвейер отдельно;
- end - обрабатывает только последний элемент переданный через конвейер. Если вы не указывали какие-то блоки, как в примере выше, по умолчанию используется именно этот блок. Из-за этого выводится только последний элемент массива.
Пример работы всех блоков:
Видно, что передача параметров без использования пайплайна вывела '1' во всех блоках.
Там, где использовался конвейер, появился 0. Это связано с тем, что блоку begin не известна эта переменна, т.е. это значение равно $Null. Т.к. эта переменная должна хранить число, а не строку, этот тип преобразовывается в 0:
Если для вас это слишком сложная конструкция, то вы можете использовать только блок Process. В случае обычных использований команды он вызывается единожды, а в случае конвейера - для каждого значения отдельно. Важно отметить, что вы не должны писать код вне Process:
stdin, stdout и stderr
Если вам сложно понять работу конвейера с примеров выше вы можете ознакомиться с понятием потоков (streams). Потоки реализованы в *nix системах и Windows. В Powershell реализовано 7 потоков, но основная концепция понятна в 3 потоках, которые так же реализованы в *nix системах. Это:
- stdin - ввод данных. Этот поток используется, когда вы печатаете текст или, например, когда результат работы одной команды принимает следующая. На уровне Powershell этого потока нет (в документациях не указывается, но скорее всего он реализован на уровне ОС);
- stdout - вывод результата. Этот результат может быть направлен на экран консоли, в файл, в другую команду и т.д. В powershell этот поток называется "Success Stream";
- stderr - вывод ошибок. В Powershell называется "Error Stream".
Пример работы этих потоков в обычном виде:
В 1-ом случае мы используем stdin т.к. напечатали команду с клавиатуры. После вызова команды мы получили stdout (2). При ошибках мы получаем stderr.
В конвейере работает такой же принцип:
Мы так же напечатали текст использовав stdin. Затем был использован конвейер, который направил результат первой команды ( stdout) в stdin другой команды (3). Так как команда 'echo' тоже использует stdout - он был выведен на экран.
Операторы перенаправления PowerShell
Ниже приведены операторы перенаправления PowerShell, где n представляет номер потока. Если поток не указан, по умолчанию используется поток Success ( 1 ).
Использование параметра ErrorAction
Переменная $ErrorActionPreference указывает глобальный приоритет, но мы можем определить такую логику в рамках команды с параметром ErrorAction. Этот параметр имеет больший приоритет чем $ErrorActionPreference. В следующем примере, глобальная переменная определяет полную остановку скрипта, а в параметр ErrorAction говорит "не выводить ошибок и продолжить работу":
Кроме 'SilentlyContinue' мы можем указывать те же параметры, что и в переменной $ErrorActionPreference.
Значение Stop, в обоих случаях, делает ошибку критической.
Операторы перенаправления PowerShell
Ниже приведены операторы перенаправления PowerShell, где n представляет номер потока. Если поток не указан, по умолчанию используется поток Success ( 1 ).
PowerShell redirection operators
The PowerShell redirection operators are as follows, where n represents the stream number. The Success stream ( 1 ) is the default if no stream is specified.
Operator | Description | Syntax |
---|---|---|
> | Send specified stream to a file. | n> |
>> | Append specified stream to a file. | n>> |
>&1 | Redirects the specified stream to the Success stream. | n>&1 |
Unlike some Unix shells, you can only redirect other streams to the Success stream.
Examples
Example 4: Redirect all streams to a file
This example sends all streams output from a script called script.ps1 to a file called script.log
Пример 3. Передача в файл успешных, предупреждающих и ошибочных потоков
В этом примере показано, как можно комбинировать операторы перенаправления для достижения желаемого результата.
- 3>&1 перенаправляет поток предупреждений в поток успешного выполнения .
- 2>&1 перенаправляет поток ошибок в поток успешного выполнения (который также включает все данные потока предупреждений ).
- > перенаправляет поток успешного выполнения (который теперь содержит потоки предупреждений и ошибок ) в файл с именем C:\temp\redirection.log ).
Long description
By default, PowerShell sends output to the PowerShell host. Usually this is the console application. However, you can redirect the output to a text file and you can redirect error output to the regular output stream.
You can use the following methods to redirect output:
Use the Out-File cmdlet, which sends command output to a text file. Typically, you use the Out-File cmdlet when you need to use its parameters, such as the Encoding , Force , Width , or NoClobber parameters.
Use the Tee-Object cmdlet, which sends command output to a text file and then sends it to the pipeline.
Use the PowerShell redirection operators. Using the redirection operator with a file target is functionally equivalent to piping to Out-File with no extra parameters.
For more information about streams, see about_Output_Streams.
Не критические ошибки (Non-Terminating Errors)
Как видно у нас появилась информация о проблеме с первым процессом 'svchost111', так как его не существует. Обычный процесс 'svchost' он у нас вывелся корректно.
Example 5: Suppress all Write-Host and Information stream data
This example suppresses all information stream data. To read more about Information stream cmdlets, see Write-Host and Write-Information
Example 2: Send all Success stream data to a file
This example sends all Success stream data to a file called script.log .
Примеры
Catch для всех типов исключений
Как и было показано выше мы можем использовать блок Catch для конкретного типа ошибок, например при проблемах с доступом. Если в этом месте ничего не указывать - в этом блоке будут обрабатываться все варианты ошибок:
Такой подход не рекомендуется использовать часто, так как вы можете пропустить что-то важное.
Мы можем вывести в блоке catch текст ошибки используя $PSItem.Exception:
Переменная $PSItem хранит информацию о текущей ошибке, а глобальная переменная $Error будет хранит информацию обо всех ошибках. Так, например, я выведу одну и ту же информацию:
Примечания
Операторы перенаправления, которые не добавляют данные ( > и n> ) перезаписывают текущее содержимое указанного файла без предупреждения.
Однако если файл доступен только для чтения, является скрытым или системным файлом, перенаправление завершается ошибкой. Операторы добавления перенаправления ( >> и n>> ) не записывают в файл, доступный только для чтения, но добавляют содержимое в системный или скрытый файл.
Для принудительного перенаправления содержимого в скрытый или системный файл только для чтения используйте Out-File командлет со своим Force параметром.
При записи в файлы операторы перенаправления используют UTF8NoBOM кодировку. Если файл имеет другую кодировку, выходные данные могут быть неправильно отформатированы. Для записи в файлы с другой кодировкой используйте Out-File командлет с его Encoding параметром.
Свойства объекта $Error
Так же как и все что создается в Powershell переменная $Error так же имеет свойства (дополнительную информацию) и методы. Названия свойств и методов можно увидеть через команду Get-Member:
Например, с помощью свойства InvocationInfo, мы можем вывести более структурный отчет об ошибки:
Создание отдельных исключений
Что бы обработать отдельную ошибку сначала нужно найти ее имя. Это имя можно увидеть при получении свойств и методов у значения переменной $Error:
Так же сработает и в блоке Catch с $PSItem:
Для вывода только имени можно использовать свойство FullName:
Далее, это имя, мы вставляем в блок Catch:
Так же, как и было описано выше мы можем усложнять эти блоки как угодно указывая множество исключений в одном catch.
Создание и изменение в Powershell NTFS разрешений ACL
Методы объекта $Error
Например мы можем очистить логи ошибок используя clear:
Выброс своих исключений
Иногда нужно создать свои собственные исключения. Например мы можем запретить добавлять через какой-то скрипт названия содержащие маленькие буквы или сотрудников без указания возраста и т.д. Способов создать такие ошибки - два и они тоже делятся на критические и обычные.
Перенаправляемые выходные потоки
PowerShell поддерживает перенаправление следующих выходных потоков.
В PowerShell также присутствует поток хода выполнения , но он не поддерживает перенаправление.
Потоки успехов и ошибок похожи на потоки stdout и stderr других оболочек. Однако stdin не подключен к конвейеру PowerShell для ввода данных.
Автоматические переменные $Error
При отсутствии каких либо ошибок мы бы получили пустой ответ, а счетчик будет равняться 0:
Переменная $Error являет массивом и мы можем по нему пройтись или обратиться по индексу что бы найти нужную ошибку:
Potential confusion with comparison operators
The > operator is not to be confused with the Greater-than comparison operator (often denoted as > in other programming languages).
Depending on the objects being compared, the output using > can appear to be correct (because 36 is not greater than 42).
However, a check of the local filesystem can see that a file called 42 was written, with the contents 36 .
Attempting to use the reverse comparison < (less than), yields a system error:
If numeric comparison is the required operation, -lt and -gt should be used. For more information, see the -gt operator in about_Comparison_Operators.
Объясняется, как перенаправлять выходные данные из PowerShell в текстовые файлы.
Width of output when writing to a file
When you are writing to a file using either Out-File or the redirection operators, PowerShell formats table output to the file based on the width of the console it is running within. For instance, when logging table output to file using a command like Get-ChildItem Env:\Path > path.log on a system where the console width is set to 80 columns, the output in the file is truncated to 80 characters:
Considering that the console width may be set arbitrarily on systems where your script is run, you may prefer that PowerShell format table output to files based on a width that you specify instead.
The Out-File cmdlet provides a Width parameter that allows you to set the width you would like for table output. Rather than having to add -Width 2000 everywhere you invoke Out-File , you can use the $PSDefaultParameterValues variable to set this value for all usages of the Out-File cmdlet in a script. And since the redirection operators ( > and >> ) are effectively aliases for Out-File , setting the Out-File:Width parameter for the whole script impacts the formatting width for the redirection operators as well. Put the following command near the top of your script to set Out-File:Width for the whole script:
Increasing the output width will increase memory consumption when logging table formatted output. If you are logging a lot of tabular data to file and you know you can get by with a smaller width, use the smaller width.
In some cases, such as Get-Service output, in order to use the extra width you will need to pipe the output through Format-Table -AutoSize before outputting to file.
For more information about $PSDefaultParameterValues , see about_Preference_Variables.
Ошибки
При создании конвейеров легко запутаться и получить странную ошибку. Часть из них рассмотрена ниже.
Если вы будете передавать данные с 'ValueFromPipelineByPropertyName', при этом ни один из ключей не совпадает, у вас появятся следующие ошибки (они выводятся и при других обстоятельствах тоже):
- Не удается привязать объект ввода к любым параметрам команды, так как команда не принимает входные данные конвейера, либо входные данные и их свойства не совпадают с любыми из параметров, принимающих входные данные конвейера;
- The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.
Если вы укажете код вне блока Process, то так же получите странную ошибку:
Как принимаются данные с конвейера
Если мы выполним следующую команду, то увидим, что у нее есть множество свойств (левая колонка), которые мы можем вернуть:
Вопрос в том, как конвейер узнает, что нам нужно использовать свойство "Name" в "Restart-Service"? В одной команде множество свойств и значений, а другой множество параметров и они могут не совпадать. У нас так же не возвращаются какие-либо ошибки.
Что бы понять как будут распределены свойства и значения нам нужно посмотреть справку по этой команде:
Строка "Принимать входные данные конвейера?" (или "Accept pipeline input") говорит, может ли в этот параметр ('-Name') попадать значение через пайплайн. Кроме этого он указывает каким образом это может произойти:
- ByPropertyName - по свойству (должен быть использован массив ключ-значение);
- ByValue - по значению (одномерный массив).
Значение '
Не все параметры у команд так очевидны. У некоторых команд можно увидеть работу через конвейер с 'InputObject'. Такой параметр подразумевает более сложную обработку поступающих данных. Процесс привязки параметров так же называется 'parameter binding'.
Простые примеры, где использовался принцип 'ByValue', мы уже рассматривали. Он выглядит так:
Работа 'ByPropertyName' - подразумевает, что вы используете массив ключ-значение. Например PSCustomObject и в нем есть ключ (в нашем случае ключ 'Name') с аналогичным названием:
Не все команды возвращают PSCustomObject. Это говорит о том, что вы можете использовать и другие типы объектов:
Главный принцип, по которому значение может таким образом успешно попасть в конвейер, это быть итерируемым. В hashtable такого по умолчанию нет.
Ширина выходных данных при записи в файл
При записи в файл с помощью Out-File или операторов перенаправления PowerShell преобразует выходные данные таблицы в файл на основе ширины консоли, в которой она выполняется. Например, при записи выходных данных таблицы в файл с помощью команды, например Get-ChildItem Env:\Path > path.log в системе, в которой ширина консоли равна 80 столбцам, выходные данные в файле усекаются до 80 символов:
Учитывая, что ширина консоли может быть задана произвольным образом на системах, где выполняется сценарий, вы можете предпочесть, чтобы формат PowerShell был выводить файлы таблицы в соответствии с заданной заданной шириной.
Out-File Командлет предоставляет параметр Width , позволяющий задать ширину для вывода в таблицу. Вместо того, чтобы добавлять -Width 2000 все при вызове Out-File , можно использовать $PSDefaultParameterValues переменную, чтобы задать это значение для всех использований Out-File командлета в скрипте. А поскольку операторы перенаправления ( > и >> ) фактически являются псевдонимами для Out-File , установка Out-File:Width параметра для всего скрипта влияет также на ширину форматирования для операторов перенаправления. Добавьте следующую команду в начало скрипта, чтобы задать Out-File:Width для всего скрипта:
Увеличение ширины выходных данных приведет к увеличению потребления памяти при регистрации выходных данных в табличном формате. Если вы записываете в файл большой объем табличных данных и вы уверены, что можете сделать это с меньшей шириной, используйте меньшую ширину.
В некоторых случаях, например Get-Service в выходных данных, чтобы использовать дополнительную ширину, необходимо передать выходные данные Format-Table -AutoSize перед выводом в файл.
Дополнительные сведения о $PSDefaultParameterValues см. в разделе about_Preference_Variables.
Notes
The redirection operators that do not append data ( > and n> ) overwrite the current contents of the specified file without warning.
However, if the file is a read-only, hidden, or system file, the redirection fails. The append redirection operators ( >> and n>> ) do not write to a read-only file, but they append content to a system or hidden file.
To force the redirection of content to a read-only, hidden, or system file, use the Out-File cmdlet with its Force parameter.
When you are writing to files, the redirection operators use UTF8NoBOM encoding. If the file has a different encoding, the output might not be formatted correctly. To write to files with a different encoding, use the Out-File cmdlet with its Encoding parameter.
Как Powershell обрабатывает ошибки
До рассмотрения основных методов посмотрим на теоретическую часть.
Пример 6. Отображение влияния настроек действий
Переменные и параметры настройки действия могут изменять содержимое, записываемое в определенный поток. Скрипт в этом примере показывает, как значение $ErrorActionPreference влияет на то, что записывается в поток ошибок .
При выполнении этого скрипта выводится запрос, когда $ErrorActionPreference для Inquire параметра задано значение.
При изучении файла журнала мы увидим следующее:
Приоритет ошибок с $ErrorActionPreference
Еще одна встроенная переменная в Powershell $ErrorActionPreference глобально определяет что должно случится, если у нас появится обычная ошибка. По умолчанию это значение равно 'Continue', что значит "вывести информацию об ошибке и продолжить работу":
Если мы поменяем значение этой переменной на 'Stop', то поведение скриптов и команд будет аналогично критичным ошибкам. Вы можете убедиться в этом на прошлом скрипте с неверным именем процесса:
Т.е. скрипт был остановлен в самом начале. Значение переменной будет храниться до момента завершения сессии Powershell. При перезагрузке компьютера, например, вернется значение по умолчанию.
Ниже значение, которые мы можем установить в переменной $ErrorActionPreference:
- Continue - вывод ошибки и продолжение работы;
- Inquire - приостановит работу скрипта и спросит о дальнейших действиях;
- SilentlyContinue - скрипт продолжит свою работу без вывода ошибок;
- Stop - остановка скрипта при первой ошибке.
Самый частый параметр, который мне приходится использовать - SilentlyContinue:
Example 3: Send Success, Warning, and Error streams to a file
This example shows how you can combine redirection operators to achieve a desired result.
- 3>&1 redirects the Warning stream to the Success stream.
- 2>&1 redirects the Error stream to the Success stream (which also now includes all Warning stream data)
- > redirects the Success stream (which now contains both Warning and Error streams) to a file called C:\temp\redirection.log )
Читайте также: