Windows PowerShell предоставляет несколько командлетов, которые позволяют напрямую управлять выводом данных. Эти командлеты обладают двумя общими важными характеристиками.
Во-первых, они обычно преобразуют данные в некоторое текстовое представление. Преобразование выполняется, поскольку данные выводятся в системные компоненты, ожидающие текстовый ввод. Это означает, что объекты должны быть представлены в текстовом виде. Поэтому текст форматируется в виде, пригодном для отображения в окне консоли Windows PowerShell.
Во-вторых, эти командлеты используют команду Windows PowerShell Out, поскольку отправляют сведения из Windows PowerShell за пределы оболочки. Командлет Out-Host не является исключением: окно ведущего приложения отображается вне Windows PowerShell. Это важно, поскольку при передаче из Windows PowerShell данные в действительности удаляются. Убедиться в этом можно, если попытаться создать конвейер, который постранично передает данные в окно главного приложения и пытается отформатировать их в виде списка, как показано ниже:
PS> Get-Process | Out-Host -Paging | Format-List
Можно было бы ожидать, что команда отобразит страницы сведений о процессе в виде списка. Вместо этого она выводит их в виде табличного списка по умолчанию:
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 101 5 1076 3316 32 0.05 2888 alg ... 618 18 39348 51108 143 211.20 740 explorer 257 8 9752 16828 79 3.02 2560 explorer ... <SPACE> next page; <CR> next line; Q quit ...
Командлет Out-Host передает данные напрямую консоли, поэтому команда Format-List так и не получает ничего для форматирования.
Чтобы правильно структурировать эту команду, нужно поместить командлет Out-Host в конец конвейера, как показано ниже. При этом данные процесса форматируются в виде списка перед разбиением на страницы и отображением.
PS> Get-Process | Format-List | Out-Host -Paging Id : 2888 Handles : 101 CPU : 0.046875 Name : alg ... Id : 740 Handles : 612 CPU : 211.703125 Name : explorer Id : 2560 Handles : 257 CPU : 3.015625 Name : explorer ... <SPACE> next page; <CR> next line; Q quit ...
Это относится ко всем командлетам Out. Командлет Out всегда должен находиться в конце конвейера.
Примечание. | |
Все командлеты Out подготавливают вывод в виде текста, используя текущее форматирование для окна консоли, включая ограничения на длину строки. |
Разбивка вывода консоли на страницы (командлет Out-Host)
По умолчанию Windows PowerShell передает данные в окно главного приложения, что и является функцией командлета Out-Host. Как было описано ранее, основное назначение командлета Out-Host заключается в разбивке данных на страницы. Например, следующая команда использует командлет Out-Host для разбивки на страницы вывода командлета Get-Command.
PS> Get-Command | Out-Host -Paging
Для разбивки данных на страницы можно также использовать функцию more. В Windows PowerShell функция more вызывает команду Out-Host -Paging. Следующая команда демонстрирует использование функции more для разбивки на страницы вывода командлета Get-Command:
PS> Get-Command | more
Если в качестве параметров этой функции указать одно или несколько имен файлов, функция прочитает указанные файлы и разобьет на страницы их содержимое при передаче в главное приложение:
PS> more c:\boot.ini [boot loader] timeout=5 default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS [operating systems] ...
Отмена вывода (командлет Out-Null)
Командлет Out-Null разработан для немедленной отмены каких-либо получаемых им входных данных. Это полезно при отбрасывании ненужных данных, полученных в качестве побочного эффекта выполнения команды. Если ввести следующую команду, ее выполнение не приведет к выдаче какого-либо результата:
PS> Get-Command | Out-Null
Командлет Out-Null не отбрасывает сообщения об ошибках. Например, если ввести следующую команду, будет отображено сообщение о том, что оболочка Windows PowerShell не распознала вызов Is-NotACommand:
PS> Get-Command Is-NotACommand | Out-Null Get-Command : 'Is-NotACommand' is not recognized as a cmdlet, function, operabl e program, or script file. At line:1 char:12 + Get-Command <<<< Is-NotACommand | Out-Null
Печать данных (командлет Out-Printer)
Данные можно распечатать при помощи командлета Out-Printer. Командлет Out-Printer использует принтер по умолчанию, если не указано имя принтера. Можно использовать любой принтер Windows, указав его отображаемое имя. Отсутствует необходимость как в привязке порта принтера, так и в присутствии реального физического принтера. Например, если имеются установленные средства управления образами документов Microsoft Office, можно направить данные в файл изображения, введя следующее:
PS> Get-Command Get-Command | Out-Printer -Name "Microsoft Office Document Image Writer"
Сохранение данных (командлет Out-File)
Вывод можно направить в файл вместо окна консоли с помощью командлета Out-File. Следующая команда направляет список процессов в файл C:\temp\processlist.txt:
PS> Get-Process | Out-File -FilePath C:\temp\processlist.txt
Результаты использования командлета Out-File не всегда соответствуют ожидаемым, если пользователь привык к традиционному перенаправлению вывода. Чтобы разобраться в его действии, нужно учесть контекст, в котором выполняется командлет Out-File.
По умолчанию командлет Out-File создает файл в формате Юникод. Это наилучшее долговременное решение, но средства, которые принимают на входе файлы ASCII, не будут корректно работать с таким форматом вывода по умолчанию. Формат вывода по умолчанию можно изменить на ASCII с помощью параметра Encoding:
PS> Get-Process | Out-File -FilePath C:\temp\processlist.txt -Encoding ASCII
Командлет Out-file форматирует содержимое файла так, чтобы оно выглядело аналогично выводу консоли. Это приводит к обрезанию вывода, как это чаще всего и происходит в окне консоли. Предположим, например, что выполняется следующая команда:
PS> Get-Command | Out-File -FilePath c:\temp\output.txt
Вывод будет выглядеть следующим образом:
CommandType Name Definition ----------- ---- ---------- Cmdlet Add-Content Add-Content [-Path] <String[... Cmdlet Add-History Add-History [[-InputObject] ... ...
Чтобы получить вывод, который не использует переносы строк для обеспечения соответствия ширине экрана, можно воспользоваться параметром Width для указания ширины строки. Поскольку параметр Width представляет собой 32-разрядное целое число, его максимальное значение может быть равно 2 147 483 647. Чтобы установить ширину строки в максимальное значение, введите следующее:
Get-Command | Out-File -FilePath c:\temp\output.txt -Width 2147483647
Командлет Out-File наиболее полезен, когда нужно сохранить вывод в том же виде, в каком он отображается на консоли. Для более точного управления форматом вывода необходимо наличие дополнительных средств. Они, а также некоторые подробности работы с объектами, будут рассмотрены в следующей главе.