Заметки о Windows и других программных продуктах Microsoft...

Командлеты PowerShell для вывода данных

Командлеты PowerShell для вывода данных

Обычно в процессе работы PowerShell генерируются некоторые выходные данные. Для вывода этих данных существуют специальные Out-командлеты (командлеты, название которых начинается с Out-). Когда выполняемая команда PowerShell возвращает данные, они передаются по конвейеру на вход Out-командлета, который обрабатывает их и отправляет в устройство вывода (на экран, в файл, на принтер и т.п.).

Для просмотра этих командлетов выполним команду:

Get-Command -Verb Out

командлеты для вывода

 

 Out-Host

Командлет Out-Host служит для вывода данных на экран. Например:

Get-Process powershell | Out-Host

Впрочем, добавлять Out-Host в конец команды совсем необязательно. В конце конвейера по умолчанию находится командлет Out-Default, который и перенаправляет все в Out-Host. Т.е. предыдущая команда эквивалентна команде:

Get-Process powershell | Out-Default

которая в свою очередь эквивалентна команде:

Get-Process powershell

На самом деле механизм вывода еще запутаннее. Как вы помните, результатом работы PowerShell являются объекты. Out-командлеты не умеют работать с любыми объектами, а только со специальным типом объектов форматирования, поэтому при получении объекта вызывают один из командлетов форматирования (Format-*).  Format-командлет предоставляет Out-командлету объекты форматирования, описывающие порядок построения выходных данных, а Out-командлет отправляет их в нужное устройство. Т.е. при выполнении команды:

Get-Process powershell

в действительности отрабатывает команда:

Get-Process powershell | Format-Table | Out-Host

вывод по умолчанию

 

Хотя добавлять Out-Host в конец команды необязательно, но в некоторых случаях удобно. К примеру он имеет ключ Paging, с помощью которого можно организовать постраничный вывод:

Get-Process | Out-Host -Paging

постраничный вывод

Out-File

Командлет Out-File перенаправляет выходные данные в указанный файл, например:

Get-Process powershell | Out-File proc.txt

По умолчанию данные в файле перезаписываются. Запретить перезапись существующего файла можно, указав ключ NoClobber, а если необходимо дописывать данные в существующий файл, то можно использовать ключ Append, который добавляет данные в конец файла:

Get-Process powershell | Out-File proc.txt -Append

out-file

 

Для вывода в файл можно использовать сокращенный синтаксис. Например для записи:

Get-Process powershell >proc.txt

или для добавления в конец файла:

Get-Process powershell >>proc.txt

Out-GridView

Командлет Out-GridView выводит данные в виде графической таблицы, в которой их можно отфильтровать и отсортировать по нужному признаку. Для наглядности можно указать ключ Title, который будет отображаться в заголовке:

Get-Process | Out-GridView -Title processes

out-greedview

 

Начиная стретьей версии PowerShell Out-GridView поддерживает ключ PassThru, позволяющий передать полученные данные дальше по конвейеру. Например, можно вывести список процессов, в графической оснастке отобрать нужные и передать их командлету Stop-Process, который остановит выбранные процессы:

Get-Process | Out-GridView -PassThru | Stop-Process

out-gridview передача по конвейеру

Out-Null

Командлет Out-Null используется в том случае, если выходные данные отображать не нужно. Он отправляет полученные данные в устройство NULL, т.е. удаляет их. Для примера возьмем такую команду:

$process = Get-WmiObject win32_process -Filter ″Name = ′Notepad.exe′″
$process.Terminate()

Помимо основного действия (остановка процесса) она выводит много лишней информации. Чтобы избавится от нее, отправим вывод в Out-Null, например так:

$process.Terminate() | Out-Null

или так:

$process.Terminate() >$null

out-null

Out-String

Командлет Out-String преобразует входные данные в массив строк. По сути Out-String преобразует объекты PowerShell в строки, с которыми дальше можно работать как с обычным текстом (форматировать, производить поиск и т.п.).

Для примера выведем процесс, сохраним его в переменную $a и посмотрим тип данных:

$a = Get-Process powershell
$a.GetType()

Затем скормим содержимое Out-String а вывод сохраним в переменную $b:

$b = $a | Out-String
$b.Get-Type()

Как видно из примера, на входе Out-String тип данных Process, а на выходе String.

преобразование объекта в строку

 

Out-String принципиально отличается от остальных out-командлетов. Поскольку обычные out-командлеты работают с конечным результатом предыдущих команд, то сами они не производят никаких выходных данных. Именно поэтому out-командлет обычно ставится последним в командной строке, ведь после него в конвейере не остается ничего, с чем могут работать другие командлеты.

В отличие от них Out-String принимает объекты, преобразует их в массив строк и передает дальше по конвейеру. По умолчанию данные накапливаются и возвращаются одной строкой, но с помощью ключа Stream можно указать вывод по отдельной строке для каждого объекта.

Для примера выведем список системных служб со всеми свойствами и отформатируем его в виде таблицы:

Get-Service | Format-Table -Property * -AutoSize

Поскольку ширина консоли граничена 80 символами, то большинство данных будет обрезано, что не очень здорово.

форматирование

 

Чтобы не обрезать вывод, направим его в Out-String и увеличим ширину:

Get-Service | Format-Table -Property * -AutoSize | Out-String -Width 1024

Теперь все данные попали на экран, но все равно выглядит не очень.

out-string

 

Исправим положение, передав вывод Out-String командлету Out-File:

Get-Service | Format-Table -Property * -AutoSize | Out-String -Width 1024 | Out-File service.txt

На выходе получаем файл с таблицей нужной ширины, а для просмотра есть полоса прокрутки. Таким образом можно создавать и просматривать таблицы практически любой ширины.

out-string + out-file

Out-Printer

Командлет Out-Printer перенаправляет вывод на принтер. Например:

Get-Service | Format-Table -Property * -AutoSize | Out-File service.txt -Width 1024
Get-Content service.txt | Out-Printer

out-printer

Вывод отправляется на принтер, заданный в системе по умолчанию. Для указания альтернативного принтера можно использовать ключ Name.

 
 
Комментарии
Игорь

Отличный сайт, с очень интересными решениями, не подскажите пожалуйста какую нибудь литературу для изучения powershell, желательно с начального уровня, спасибо.

Вот неплохие книги для начала:
Андрей Попов, Введение в Windows PowerShell
Wilson E. Windows PowerShell 3.0 First Steps

Их вполне можно найти в свободном доступе.

Алексей

Добрый день! Столкнулся с проблемой, и что-то пока не получается её решить, возможно вы подскажите.
Есть задача брать логин пользователя и записывать его в текстовый файлик

$login = «i.ivanov»
$login | Out-File «C:\importfile» -Encoding default

Но есть загвоздка: после логина Out-File ставит перенос строки, что приводит к ошибке дальнейшей обработки данного файла, т.е. переноса строки быть не должно. Как создать файл без переноса строки?

Алексей

Спасибо, уже сам нашел))

[io.file]::WriteAllText(«C:\importfile»,»$login»)

Валерон

Мужик, ты не представляешь, как ты мне помог… 3,5 часа искал ответ. По работе понадобилось. PowerShellom занимаюсь 5 часов…

Vector BCO

Для одновременного вывода и в консоль и в файл можно использовать функцию write-filelog
https://gallery.technet.microsoft.com/Write-FileLog-Redirect-a91cdc2f

Сергей

подскажите, как форматировать вывод? Есть скрипт:
Import-Module ActiveDirectory
get-adgroup -filter * -SearchBase «OU=Группы ,DC=domain,DC=local» | foreach {
$group = Get-AdGroup $_.Name
Get-ADUser -Filter {MemberOf -recursivematch $group.DistinguishedName}
} | Out-GridView
он выводит пользователей в группе, для каждой группы, НО в этот вывод нужно еще вывести имя группы $_.Name, как это сделать?

На первый взгляд никак 🙂
По идее надо отформатировать вывод, но Out-GridView это не поддерживает.
На вход ему передается объект User со своими свойствами. Просто так добавить ему еще одно свойство нельзя.
А вообще, какая задача должна выполняться с помощью данной конструкции?

Подскажите а как вывести всех пользователей в определённой OU но с информацией о:
cn
sAMAccountName
description
lastLogonTimestamp
departament
title
mail
userAccountControl (Заблокирована/отключена ил УЗ или нет)

Vector BCO

get-aduser * -searchbase ‘ou=managers,dc=some,dc=company,dc=com’ -Properties * | select cn,samaccountname,title,mail…

А как вывести информацию в файл определённой кодировке

Leave a Reply to Vector BCO