Powershell вывести в файл

Обновлено: 04.07.2024

Из моей первой ознакомительной статьи Вы уже могли сформировать некоторое представление о конвейере в Powershell. И о том, что командлеты могут передавать результат выполнения следующим командам для последующей обработки.

В powershell все, с чем можно взаимодействовать – это объекты с набором свойств. И даже текстовый файл технически представляет из себя набор строковых объектов. А каждая строка функционирует как уникальный и независимый объект. Объекты можно передавать от одной команды к другой бесконечно, пока Вы не получите нужный результат.

Итак, все, что выполняется в powershell, выполняется по конвейеру. Он может состоять из одной или множества команд. И эти команды выполняются слева на право, а разделяются они символом “|”. Большинство командлетов на выходе не генерируют читабельный вывод (таблицы, списки и т.д.). Но генерируют список объектов с их свойствами. В связи с чем в powershell существуют команды, которые отвечают за формирование удобно читаемого вывода.

Форматируем вывод: Select-Object

Каждый объект любого типа имеет определенный набор свойств, который отображается по умолчанию. То есть, объект имеет множество свойств, но отображается только несколько основных. Чтобы просмотреть полный список свойств объекта и их значений необходимо в конвейер добавить команду “Select-Object *”. Символ * является подстановочным, что означает – показать все что есть. Если Вам нужно посмотреть только какое-то одно свойство, тогда вместо * необходимо указать его название. Так же возможен смешанный вариант, когда требуется отобразить свойства по маске. Например – Select-Object *quota* выведет все свойства, в названии которых присутствует слово “quota”

С помощью Select-Object Вы можете определить только те свойства, которые Вам интересны, перечислив их через запятую. Этот принцип действует для всех команд форматирования вывода. Для примера Get-Service по умолчанию выводит свойства Status, Name и DisplayName. Уберем из вывода DisplayName и добавим StartType, который не отображается по умолчанию:

Обычно в процессе работы 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

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

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

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

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, например так:

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 при сохранении данных в файл. Этот функционал применяется практически всегда, когда речь заходит о больших выгрузках, о результатах работы каких-либо автоматизаций. Банальным примером будет настройка логирования выполнения скрипта в планировщике задач.

Экспорт данных в файл. Add-Content, Set-Content

Исходя из названия команд, не сложно догадаться, как они работают. Командлет Add-Content выполняет добавление информации в указанный файл. В то время как Set-Content выполняет полную перезапись файла теми данными, которые он получил на вход.

Синтаксис группы этих команд идентичен друг другу и достаточно прост. Чтобы получить содержимое файла, необходимо просто указать путь к файлу в параметре -Path:

Так как командлет по умолчанию ожидает получение параметра -Path, его имя можно опустить: “Set-Content D:\processes.txt “.

Так же здесь работает принцип конвейеризации – "Hello World!" | Add-Content C:\Test.txt или Set-Content C:\Test.txt -Value "Hello World!" по принципу действия будут похожи. За тем исключением, что в первом случае данные передаются по конвейеру, а во втором указаны явно в параметре -Value.

Out-File

Out-File – пожалуй основной способ сохранения текстовых данных на жесткий диск. Этот командлет является более универсальной альтернативой командам Add-Content и Set-Content. Этот командлет выводит в файл данные в том виде, в котором они поступают ему на вход. По этой причине его довольно часто используют в связке с командами, предварительно конвертирующими вывод в необходимый формат. Примером таких команд могут служить команды ConvertTo-Csv, ConvertTo-Html, ConvertTo-Json, ConvertTo-Xml. О том как получить справку по командам, можно узнать здесь .

Get-Volume | ConvertTo-Html | Out-File C:\ProcessList.html

В этом примере перед сохранением в файл данные конвертируются в HTML код. И Вы можете сохранить их в HTML документ. При этом возможно вносить элементы форматирования страницы, используя CSS. Если есть необходимость просто сохранить данные на диск в первозданном виде, тогда необходимо просто использовать командлет Out-File.

Некоторые полезные параметры:

  • -Force – выполнение с этим ключом приведет к перезаписи файла в случае его существования на момент выполнения команды;
  • -Append – если файл уже существует, то выполнение с этим ключом не перезапишет весь файл. А данные будут добавлены в конец файла. Отличный способ для настройки логирования. В сочетании с параметром -Force данные будут добавлены в файл даже при установленном флаге – только чтение;
  • -Encoding – позволяет определять кодировку для данных перед их записью в файл;
  • -NoClobber – при указании этого параметра, если файл уже существует с таким именем, он не будет перезаписан.

Export-Csv

Этот вид экспорта наиболее подходит и чаще всего применяется для формирования табличных выгрузок или отчетов. В параметрах этого командлета есть возможность указать, какой символ будет служить разделителем. Для демонстрации выгрузим все виртуальные машины на хосте виртуализации в файл .csv. Подробнее ►

В числе прочего WMI предоставляет доступ к файловой системе и позволяет производить некоторые действия с файлами и папками. Создавать файлы\папки с помощью WMI нельзя, но можно копировать, удалять и переименовывать файлы. Сегодня мы немного поиздеваемся 🙂 над файлами с помощью WMI и PowerShell.

Поиск файлов

Найти нужные файлы можно с помощью командлета Get-CimInstance. Для примера выведем список текстовых файлов, находящихся в директории C:\Files, командой:

Get-CimInstance -ClassName CIM_DataFile -Filter ″Drive=′C:′ and Path=′\\Files\\′ and Extension=′txt′″

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

поиск файла при помощи фильтра

Как вариант, для поиска можно использовать запросы на языке WQL (WMI Query Language). Следующей командой выведем файлы, находящиеся в директории C:\Files и имеющие в своем имени obj:

Get-CimInstance -Query ″SELECT * FROM CIM_Datafile WHERE Drive=′C:′ AND Path=′\\Files\\′ AND Name LIKE ′%obj%′″ | select Name,Version

поиск файла при помощи запроса WQL

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

$file = Get-CimInstance -ClassName CIM_Datafile -Filter ″Name=′C:\\Files\\user.txt′″
$file | Get-Member -MemberType Properties

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

вывод свойств файла

В качестве примера возьмем дату последнего изменения (LastModified) и найдем все файлы в директории C:\Files, у которых эта дата старше 6 месяцев:

$Date = (Get-Date).addMonth(-6)
$query = ″SELECT * FROM CIM_DataFile WHERE Drive=′C:′ AND Path=′\\Files\\′″
Get-CimInstance _Query $query | where | select Name, LastModified

поиск файлов старше чем

Примечание. Когда вы производите поиск файлов с помощью Get-ChildItem, то у вас есть возможность указать ключ Recurce для рекурсивного поиска по всем поддиректориям. В отличие от него Get-CimInstance ищет только в указанном расположении. WMI не имеет встроенной рекурсии, поэтому поиск по поддиректориям необходимо реализовывать собственными силами.

Удаление файлов

Все основные операции с файлами производятся с помощью командлета Invoke-CimMethod. Например, для удаления одного файла user.txt можно воспользоваться такой командой:

Get-CimInstance -ClassName CIM_Datafile -Filter ″Name=′C:\\Files\\user.txt′″ | Invoke-CimMethod -MethodName Delete

А удалить из папки все файлы, имеющие в имени user можно так:

$Query = ″SELECT * FROM CIM_Datafile WHERE Drive=′C:′ AND Path=′\\Files\\′ AND Name LIKE ′%user%′″
Invoke-CimMethod -Query $query -MethodName Delete

удаление выбранных файлов

Переименование файлов

Переименование производится с помощью метода Rename. Например, переименовать один файл можно таким образом:

$query = ″SELECT * FROM CIM_Datafile WHERE Name=′C:\\Files\\error.txt′″
$NewName = ′C:\Files\OldError.txt′
Invoke-CimMethod -Query $query -MethodName Rename -Arguments @

переименование файла

Один файл переименовать достаточно просто, поэтому возьмем более сложный случай. Например, требуется переименовать группу файлов, заменив в имени файла img на pic. Делаем так:

переименование группы файлов

Копирование файлов

Процедура копирования очень похожа на переименование. Например, скопируем файл pic.jpg из директории C:\Files в C:\Temp такой командой:

Invoke-CimMethod -MethodName Copy -Query ″SELECT * FROM CIM_DataFile WHERE Name=′C:\\Files\\pic.jpg′″ -Arguments @

копирование файла

А для копирования из C:\Files в C:\Temp всех файлов с именем pic воспользуемся следующей конструкцией:

копирование группы файлов

Как видите, WMI предоставляет альтернативный вариант доступа к файловой системе. Конечно не самый простой и удобный, но вполне рабочий.

Читайте также: