PowerShell Write-Output: Ваш друг по выводу

Прощайте скучный, предсказуемый вывод скриптов! С помощью командлета PowerShell Write-Output вы можете добавить штрих креативности и индивидуальности в свои сценарии PowerShell.

Командлет Write-Output – мощный инструмент и идеальный компаньон для всех ваших потребностей в автоматизации и управлении системой. И в этом руководстве вы узнаете, как максимально использовать потенциал командлета Write-Output.

Готовы? Читайте дальше и откройте для себя волшебство командлета Write-Output!

Предварительные требования

Это руководство будет демонстрацией на практике. Чтобы следовать за ним, убедитесь, что у вас есть компьютер с установленным PowerShell (желательно последней версией). В этом руководстве используется Windows 10 с установленным PowerShell 7.

Вывод объектов на консоль

Командлет PowerShell Write-Output записывает объекты в поток вывода и отображает вывод команды или сообщение на консоли. Но вы удивитесь, насколько этот инструмент делает вывод более осмысленным и ценным.

Вместо отображения вывода в консоли используйте командлет Write-Output, чтобы настроить вывод. Командлет Write-Output может выводить любой объект или тип данных, такие как строки, целые числа, массивы и даже сложные объекты.

Запустите нижеприведенную команду, чтобы вывести сообщение Hello, World! в консоль.

Write-Output "Hello, World!”

Ниже вы можете увидеть самую базовую функцию командлета Write-Output. Но продолжайте читать, чтобы узнать о более сложных способах использования этой команды.<>

Outputting objects to the console

Передача объектов в другую команду

Помимо отображения вывода в консоли, вы можете использовать командлет Write-Output для отправки объекта в другую команду для дальнейшей обработки. Как? С помощью оператора конвейера (|). Конвейеризация делает командлет Write-Output удобной и универсальной командой для автоматизации и задач управления системой.

Предположим, вы хотите узнать, какой процесс потребляет больше всего ресурсов, таких как ЦП.

Выполните нижеприведенные команды, чтобы выполнить следующее:

  • Получить список всех процессов (Get-Process), запущенных на вашей системе.
  • Выходной список направляется в конвейер, который затем передается команде Sort-Object. Оператор конвейера позволяет объединять несколько команд вместе и обрабатывать вывод одной команды как вход для другой.
  • Сортируйте список процессов (Sort-Object) по использованию CPU в порядке -Descending.
$processes = Get-Process
Write-Output $processes | Sort-Object CPU -Descending

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

Отсортированный список отображается в консоли, как показано ниже.

Passing objects to another command

Вывод объектов с пользовательским форматом

Вы видели базовый формат вывода командлета Write-Output, который работает нормально. Но если хотите, вы также можете выводить объекты с пользовательским форматом, чтобы добавить личное прикосновение. Пользовательский формат может быть полезен, когда вы хотите отобразить определенные свойства объекта или настроить внешний вид вывода.

Для вывода объекта с пользовательским форматом используйте Format-Custom вместе с командлетом Write-Output, как показано ниже:

чтобы создать пользовательский формат вывода, а затем направьте вывод командлета Format-Custom в Write-Output.<>

Запустите нижеприведенную команду, которая не генерирует вывод, но создает объект (хэш-таблицу), содержащий три свойства с соответствующими значениями для вывода.

$object = [pscustomobject]@{
Property1 = "Value1"
Property2 = "Value2"
Property3 = "Value3"
}

Теперь выполните следующую команду, чтобы выполнить следующее:

  • Создайте пользовательский формат (Format-Table) для вывода (Write-Output) вашего hashtable ($object). Свойства Property1, Property2 и Property3 установлены как столбцы.
  • Настройте ширину столбцов (-AutoSize), чтобы они вмещали содержимое.
$object | Format-Table -Property Property1, Property2, Property3 -AutoSize | Write-Output
Creating a custom format for an object output

В качестве альтернативы вы можете использовать командлет Format-List с Write-Output, чтобы вывести объект в виде списка пары свойство-значение.

$object | Format-List -Property Property1, Property2, Property3 | Write-Output
Outputting the object as a list of property-value pairs

Передача объекта коллекции как единого целого

По умолчанию Write-Output отправляет каждый элемент коллекции через конвейер отдельно, процесс называется перечислением. Но вы можете предотвратить это поведение, добавив параметр -NoEnumerate, передавая весь объект коллекции как единую сущность.

Чтобы увидеть, как работает параметр -NoEnumerate, выполните следующие шаги:

Выполните следующие команды, чтобы выполнить следующее:

  • Объявите массив $numbers от одного до трех (1,2,3).
  • Подсчитайте количество объектов (Measure-Object), переданных через конвейер.
  • Выведите измерение объекта (Write-Output $numbers).

Без параметра NoEnumerate, Measure-Object возвращает количество три (3), так как каждый элемент массива $numbers перечислен и передан индивидуально через конвейер.

# Объявляет массив
$numbers = 1,2,3
# Выводит количество объектов, переданных через конвейер
Write-Output $numbers | Measure-Object
Outputting an array object measurement

Теперь выполните следующие команды, чтобы вывести количество объектов, переданных через конвейер.

Но поскольку вы добавили параметр -NoEnumerate, cmdlet Measure-Object обрабатывает объект как единое целое, возвращая количество один (1).

# Объявляет массив
$numbers = 1,2,3
# Выводит количество объектов как единое целое, переданных через конвейер
Write-Output -NoEnumerate $numbers | Measure-Object
Outputting object count as a single entity

Заключение команды Write-Output в круглые скобки (т.е. (Write-Output 1,2,3)) приведет к принудительному перечислению, независимо от параметра -NoEnumerate.

Создание системы меню и запросов ввода

Еще одним отличным способом использования команды Write-Output является создание системы меню с помощью сценария PowerShell, который запрашивает ввод пользователя.

Создайте файл .ps1 с помощью вашего предпочтительного текстового/кодового редактора, заполните приведенный ниже код и сохраните файл. Вы можете назвать файл как угодно, но выбор этого учебного пособия – myoutput.ps1.

Код ниже использует цикл для постоянного предложения пользователю выбрать опцию из списка опций, пока пользователь не выберет опцию Выход.

# Инициализируйте переменную $exit значением $false
$exit = $false

# Запустите цикл, который будет выполняться, пока пользователь не выберет опцию "Выход"
while (!$exit) {

  # Отобразите список вариантов для пользователя
  Write-Output "Please select from the following options:"
  Write-Output "1. Option 1"
  Write-Output "2. Option 2"
  Write-Output "3. Option 3"
  Write-Output "4. Exit"

  # Запросите у пользователя выбор
  $selection = Read-Host

  # Используйте оператор switch для выполнения различных кодов в зависимости от выбора пользователя
  switch ($selection) {
    1 {
      # Если пользователь выбирает опцию 1, отобразите сообщение и выполните действие для опции 1
      Write-Output "You selected Option 1."
      # Выполните действие для опции 1
    }
    2 {
      # Если пользователь выбирает опцию 2, отобразите сообщение и выполните действие для опции 2
      Write-Output "You selected Option 2."
      # Выполните действие для опции 2
    }
    3 {
      # Если пользователь выбирает опцию 3, отобразите сообщение и выполните действие для опции 3
      Write-Output "You selected Option 3."
      # Выполните действие для опции 3
    }
    4 {
      # Если пользователь выбирает опцию 4, установите $exit в $true для выхода из цикла
      $exit = $true
    }
  }
}

Теперь запустите сценарий (myoutput.ps1) из рабочего каталога.

./myoutput.ps1

Как показано ниже, сообщение, связанное с вашим выбором, отображается, когда вы выбираете варианты 1, 2 или 3. Но когда вы выбираете опцию 4, сценарий завершается.

Creating a menu system and input prompts

Отображение экрана приветствия или приветственного сообщения

Кроме перечисления вариантов, из которых пользователи могут выбирать, с помощью Write-Output также можно отображать заставку или приветственное сообщение. Эффектные заставки создают хорошее впечатление (профессиональное и отполированное) на ваш сценарий.

Замените код в вашем файле myoutput.ps1 на следующий, который выводит заставку (баннер приветствия), когда вы запускаете свой сценарий.

Вы можете настроить заставку, изменив текст и форматирование баннера. По желанию вы можете добавить дополнительные элементы, такие как логотип или текст, в заставку.

# Очистите экран
Clear-Host

# Покажите заставку с помощью Write-Output
Write-Output "##############################################"
Write-Output "#                                            #"
Write-Output "#   Welcome to the SuperScript 3000!         #"
Write-Output "#                                            #"
Write-Output "##############################################"

Теперь запустите сценарий и посмотрите, как выглядит ваша заставка.

./myoutput.ps1
Displaying a splash screen or welcome message

Отображение полосы прогресса

При выполнении сценариев индикатор прогресса устраняет беспокойство пользователя о том, выполняется ли сценарий или нет. Полосы прогресса могут быть полезны для отображения хода долгого сценария или операции пользователю. К счастью, с помощью cmdlet Write-Output вы можете создать полосу прогресса по своему вкусу.

Откройте ваш файл myoutput.ps1 и добавьте следующий код в конец существующего в сценарии.

Нижеприведенный код использует цикл while, чтобы перебирать несколько шагов. В данном примере – 100 шагов. Каждая итерация цикла вычисляет процент выполненных шагов и отображает полосу прогресса с использованием Write-Output.

Полоса прогресса создается с использованием комбинации следующих операторов:

  • * – Повторяет строку указанное количество раз
  • $() – Позволяет включить вывод выражения в строку.

Затем сценарий приостанавливается (Start-Sleep) на 1 секунду для имитации прогресса перед переходом к следующему шагу.

# Устанавливаем общее количество шагов для индикатора прогресса
$steps = 100

# Инициализируем счетчик текущего шага
$currentStep = 0

# Запускаем цикл, который будет выполняться в течение указанного количества шагов
while ($currentStep -lt $steps) {
  # Увеличиваем счетчик текущего шага
  $currentStep++

  # Рассчитываем процент выполненных шагов
  $percentComplete = [int] ($currentStep / $steps * 100)

  # Отображаем индикатор прогресса с помощью Write-Output
  Write-Output "Progress: [$("=" * $percentComplete)$(" " * ($steps-$percentComplete))] $percentComplete% complete"

  # Приостанавливаемся на 1 секунду для имитации прогресса
  Start-Sleep -Seconds 1
}

Теперь запустите сценарий и посмотрите, как работает индикатор прогресса.

./myoutput.ps1

Ниже вы можете увидеть экран приветствия вместе с индикатором прогресса.

Displaying a progress bar

Заключение

В этом руководстве вы увидели, как легко с помощью Write-Output можно выводить объекты, типы данных и пользовательские форматы. Кроме того, вы коснулись использования оператора конвейера для отправки вывода в другие команды для дальнейшей обработки.

Независимо от того, пишете ли вы простые сообщения или сложные задачи автоматизации, Write-Output является незаменимым инструментом для создания более информативных и профессиональных сценариев PowerShell.

Обладая этим новым знанием, почему бы не записывать ваши выводы в различные типы файлов, такие как .txt и .xml? Независимо от цели, копии вывода пригодятся при устранении проблем с вашей системой или приложениями. Write-Output и командлет Out-File предоставляют вам мощь, о которой вы даже не подозревали.

Source:
https://adamtheautomator.com/powershell-write-output/