Больше возможностей PowerShell: работа с командлетом Out-String

Опубликовано: 15 Марта, 2023
Больше возможностей PowerShell: работа с командлетом Out-String

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

Работа с текстовыми файлами

Один из способов, которым мне нравится использовать командлет Out-String, — сопоставить содержимое текстового файла с переменной. Как вы, возможно, уже знаете, PowerShell позволяет относительно легко отображать содержимое текстового файла на экране. Вы можете использовать командлет Get-Content вместе с путем и именем файла. Если бы, например, я хотел отобразить текстовый файл с именем C:DataLicense.txt, я бы использовал эту команду:

Get-Content -Path C:DataLicense.txt

Особенность этой команды в том, что она отображает только содержимое текстового файла. Он не очень подходит для того, чтобы позволить вам манипулировать содержимым текстового файла (хотя вы можете сделать это окольным путем). В качестве альтернативы вы можете использовать командлет Out-String не только для отображения содержимого текстового файла, но и для форматирования вывода в соответствии с вашими потребностями. Итак, давайте рассмотрим пару примеров.

Если вы посмотрите на скриншот ниже, вы увидите, что я использовал командлет Get-Content для отображения содержимого текстового файла с именем License.txt. Этот файл является просто файлом лицензии Python, но я сократил его, чтобы все содержимое файла уместилось на экране.

Теперь, если вы посмотрите на следующий снимок экрана, вы увидите, что я добавил командлет Out-String к команде, которую уже использовал. Сначала может показаться, что я не делаю ничего другого, потому что результат точно такой же. Однако важно то, что текст теперь обрабатывается как строка, и строками можно манипулировать.

Теперь предположим, что по какой-то причине я хочу отобразить только первый абзац текстового файла. Первым шагом в этом является сопоставление содержимого текстового файла с переменной. Я назову эту переменную $A. Вот команда:

$A=Get-Content -Path C:DataLicense.txt

Затем я передаю переменную $A в команду Out-String. Я также собираюсь добавить команду -Stream. Это приводит к тому, что каждый блок текста (разделенный разрывом строки) обрабатывается как отдельный поток. Теперь мне просто нужно указать PowerShell, какой абзац я хочу отобразить. Поскольку первое слово целевого абзаца — Python, я добавлю Select-String «Python» в конец команды. Вот как выглядит команда:

$A | Out-String -Stream | Select-String Python

Вы можете увидеть эти команды в действии на скриншоте ниже. Я также отобразил полное содержимое переменной $A, чтобы вы могли видеть, что я действительно показываю подраздел текстового файла.

Изображение 4319
Следует иметь в виду, что, поскольку я работаю со строковым выводом, я могу манипулировать этим выводом различными способами. Например, я могу заменить некоторые символы альтернативным текстом или обрезать часть вывода. PowerShell предоставляет ряд опций для работы со строками.

Преобразование вывода команды в строку

Еще одна вещь, которую вы можете сделать с помощью командлета Out-String, — это объединить содержимое нескольких переменных в одну строку. При написании несвязанной статьи я создал две переменные с именами $File1 и $File2. Эти две переменные содержат хэш MD5 для двух разных файлов. Если бы я захотел, я мог бы объединить содержимое этих переменных в одну строку. Вот как это делается:

$A=($File1,$File2 | Out-String)

Вы можете увидеть результат на скриншоте ниже. Глядя на вывод, вы заметите, что хотя переменная $A содержит оба хэша, они перечислены в отдельных строках. В документации к командлету Out-String указано, что разрыв строки можно удалить, добавив параметр NoNewLine. Однако на практике этот параметр не поддерживается (по крайней мере, не в версии PowerShell для Windows 10, которую я использую).

Выбор элемента из списка

Есть еще один трюк, который я хочу вам показать. Если вы работаете с PowerShell, вы, вероятно, знакомы с такими командами, как Get-Process, Get-Service или Get-VM, которые отображают в своих выходных данных длинные списки элементов. В сочетании с такими командами можно использовать командлет Out-String. При этом вы можете записать все или часть вывода в строковую переменную. Преимущество этого заключается в том, что вы можете фильтровать вывод практически любым удобным для вас способом.

Если вы посмотрите на скриншот ниже, вы увидите, что я создал переменную с именем $A и сопоставил ее с командлетом Get-VM. Когда я вывожу содержимое переменной, мне предоставляется список виртуальных машин на моем компьютере.

Изображение 4320
Моя переменная $A содержит список моих виртуальных машин.

Теперь давайте выведем это в строку. Просто чтобы было интересно, давайте объединим вывод, отображая только первые 50 символов. Команда для этого:

Out-String -InputObject $A -Width 50

Вы можете увидеть результат на скриншоте ниже.

Изображение 4321
Еще одна вещь, которую я могу сделать, это отфильтровать вывод, чтобы показать только одну из виртуальных машин в списке. Вот команда, которую я использовал:

Out-String -InputObject $A -Width 50 -Stream | Select-String “VM1”

Как вы можете видеть на снимке экрана ниже, выходные данные не только объединены, но и отфильтрованы для отображения только VM1.
Изображение 4322

Проявите творческий подход с Out-String

Как видите, команда Out-String позволяет вам выполнять различные творческие действия в сценариях PowerShell. На самом деле, эта статья только начинает поверхностно рассказывать о том, что вы можете делать со строками в PowerShell.