Powershell сообщение на экран

Обновлено: 06.07.2024

здесь перечислены разные способы создания объектов PowerShell. Даны советы и трюки. Текст великоват. Для всех изучающих пошик.

Кроме удобства чтения, количество нажатий на клавиши, требования к сохранению порядка свойств, все эти методы по существу делают тоже самое. Несколько тонких различий: техника 1, хэш таблица. Как правило самая быстрая, техника 2 медленнее, техника 3 может быть значительно медленнее.

21.2 Синтаксис для создания пользовательских объектов
Мы часто говорили, что всегда есть несколько способов сделать что-либо в PowerShell, и это, верно для пользовательских объектов. Мы покажем вам все основные пути, потому что вы, наверняка столкнетесь с ними в жизни, мы хотим, чтобы вы могли распознать их и использовать их, когда вы захотите.

Глава 21.1 Техника номер 1. Использование хеш таблиц для создания кастомных объектов.

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

выполнив этот код вы получите результат подобный этому:

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

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

Преимущество этого подхода в том что легко построить хэш таблицу на лету и создать из нее много пользовательских объектов. Вы можете заметить что в выходном объекте свойства имеют не тот же самый порядок как они были определены в таблице. Одно из возможных решений — создать форматирование для кастомного объекта (специальный XML файл описывающий как выводить на экран, в каком порядке и т.п.) или, если вы используете powershell 3 и выше, то можно использовать свойство ordered

Все остальное тоже самое. Теперь свойства объекта будут отображаться в том порядке как они были записаны. Если вы передадите $obj на Get-Member, вы увидете что это PS-CustomObject.

21.2.2 Техника 2. Использование Select-Object
Этот метод был фаворитом в PowerShell v1, и мы по прежнему видим людей использующих его. Нам она не нравится поскольку ее гораздо сложнее читать. Следующий листинг показывает технику где мы создадим пустой объект, а затем запишем значения этих свойств

Листинг 21.3. Создание объекта используя Select-Object


Обратите внимание, что в листинге 21.3 было сделано $obj = 1, по существу значение 1 никогда не будет использовано.

СОВЕТ Вы увидите много примеров, когда пустая строка используют в качестве инициализатора: $obj="" | select . . Это просто способ определить $obj как объект, закинуть в конвеер что-то, чтобы перейти к Select-Object, который и сделает всю работу.

В этом подходе есть недостаток. Подадим $obj в Get-Member и посмотрим на результат.


Свойства на месте, но TypeName может привести к проблемам или даже просто путанице, все зависит от того что вы еще намереваетесь делать с этим объектом. Мы рекомендуем избегать эту технику.

image

вставка от переводчика
Здесь имеет в виду вот что:
подадим в Get-Member пример из листинга 21.2 — где мы создавали хэш таблицей

image

теперь подадим на GM пример из листинга 21.3 — создание через Select-Object

21.2.2 Техника 3. Использование Add-Member
Этот метод считается формальным. Мы считаем что он иллюстрирует то что происходит в жизни с формальными подходами. Он наиболее дорогостоящий в вычислительном отношении, медленее всех, так что не часто встретишь людей использующих его в реальной жизни. Это наиболее общий подход PowerShell v1. Есть две вариации, и сначала листинг с кодом.

Листинг 21.4. Создание объекта используя Add-Member

Мы создали PSObject и добавляем по одному свойству к нему за раз. Вам нужно вызвать метод каждый раз когда вы добавляете NoteProperty которая содержит только статическое значение. Для сокращения кода мы использовали позиционные параметры Add-Member. Если использовать полный синтаксис то каждый оператор Add-Member будет выглядеть следующим образом


вы видите что получается очень много кода.

Вариация этого метода заключается в использовании парамера -PassThru (сокращенно -Pass в листинге 21.5) команды Add-Member. Этот параметр поместит модифицированный объект обратно в конвеер, так что вы сможете передать его на следующую команду и так далее.

Покажем на примере

Листинг 21.4. Создание объекта используя Add-Member с параметром -PassThru


Вы можете встретить этот подход в жизни. На самом деле с точки зрения эксплуатации это жизненная техника, потому что гораздо яснее что происходит. Этот подход не следует синтаксическим ярлыкам и его легче разбирать шаг за шагом.

21.2.4 Техника 4. Использование декларации типа

Это одна из вариаций техники 1, работает только в PowerShell v3 и v4, этот метод компактнее. Вы начинаете с тойже хэш таблицы.


Вы могли бы продолжать заполнять переменную $props, трюк этой техники в том что порядок свойств в объекте будет сохранен также как будто мы использовали директиву [ordered]

Вы могли заметить, что предыдущие методы добавляют свойства в другом порядке чем вы их добавляете. В технике 1 например мы не добавили Computer_Name первым, но он был бы выведен первым в списке. Не беспокойтесь, в подавляющем большинстве случаев PowerShell работает со свойствами в любом порядке. Техника 4 сохраняет порядок свойств, если вам это нужно используйте ее.

21.2.5 Техника 5. Создание нового класса

Листинг 21.7 Создание объекта используя класс

Add-Type используется для компиляции класса, после чего мы можем использовать его вместо PSObject. Для установки свойств объекта может быть использована техника представленная здесь и в листинге 21.6:

проведем тестирование в Get-Member

21.2.6 Какие различия.

Кроме удобства чтения, количество нажатий на клавиши, требования к сохранению порядка свойств, все эти методы по существу делают тоже самое.

Несколько тонких различий: техника 1, хэш таблица. Как правило самая быстрая, особенно когда вы работаете с несколькими объектами, техника 2 немного медленнее, техника 3 может быть значительно медленнее.

date

02.10.2018

user

itpro

directory

PowerShell, Windows 10

comments

комментариев 20

Несмотря на то, что PowerShell консольный язык, иногда необходимо из скрипта PowerShell оповестить пользователя об определенном событии или необходимости выполнить определенное действие. Например, вывести уведомление о завершении какого-либо длительного PoSh скрипта, или об наступлении какого-то важного события.

Самый простой способ вывести окошко с произвольным тестом через подсистему сценариев Windows – Wscript.

Следующий код выведет обычное текстовое окно с необходимым текстом и кнопкой OK.

$wshell = New-Object -ComObject Wscript.Shell
$Output = $wshell.Popup("Скрипт формирования отчета выполнен")

Wscript.Shell вывод уведомлений в POwershell

$wshell.Popup

$Output = $wshell.Popup("Скрипт формирования отчета завершен! Хотите вывести его на экран?",0,"Отчет готов",4+32)

Общий синтаксис и параметры метода Popup:

  • 0 — кнопка ОК.
  • 1 — кнопки ОК и Отмена.
  • 2 — кнопки Стоп, Повтор, Пропустить.
  • 3 — кнопки Да, Нет, Отмена.
  • 4 — кнопки Да и Нет.
  • 5 — кнопки Повтор и Отмена.
  • 16 — значок Stop.
  • 32 — значок Question.
  • 48 — значок Exclamation.
  • 64 — значок Information.

Описание: возвращает целое значение, с помощью которого можно узнать, какая кнопка была нажата пользователем. Возможные значения:

  • -1 — таймаут.
  • 1 — кнопка ОК.
  • 2 — кнопка Отмена.
  • 3 — кнопка Стоп.
  • 4 — кнопка Повтор.
  • 5 — кнопка Пропустить.
  • 6 — кнопка Да.
  • 7 — кнопка Нет.

всплывающее уведомление в POwerShell

Модуль устанавливается из онлайн репозитория с помощью менеджера пакетов Windows 10:
Install-Module -Name BurntToast

Теперь, например, в ранее рассматриваемый скрипт автоматического отключение от Wi-FI сети при подключении к Ethernet можно добавить красочное уведомление:

New-BurntToastNotification -Text "Отключение от Wi-Fi сети", "Вы были отключены от Wi-Fi сети, т.к. Вше устройство было подключено к скоростному Ethernet подключению." -AppLogo C:\PS\changenetwork.jpg

Итак, теперь вы знаете как вывести уведомление пользователя через PowerShell. Если у пользователя есть динамики, можно даже сыграть ему мелодию:

Я не нашел способа сделать так, что бы вызываемое окно было поверх всех остальных окон, с помощью стандартных средств PS:

Но я знаю что в VBS есть свойство MsgBox под названием SystemModal, которое как раз и заставляет появляться popup окно поверх всех, расположенных на экране.

Мы можем убедиться в этом так:

Доступные свойства

[ Microsoft . VisualBasic . Interaction ] :: MsgBox ( "Text" , "OKOnly,SystemModal,Information" , "Title" )

На первый взгляд этот способ ничем не лучше предыдущего, но он немного короче и не требует подгрузки дополнительных компонентов.
А так же в PowerShell версии 6.1 удален командлет Add-Type.

Если собираетесь использовать IP, или не в домене, то вы будете использовать не Kerberos, а NTLM и нужно сделать следующее:

Если в последующем будут ошибки, то стоит прочитать статью, т.к. настроек может понадобится больше.

Сначала получим все имена всех компьютеров в домене и присвоим переменную. Если мой домен называется domain.local, то командлет будет выглядеть так:

Мы можем добавить OU, если у нас нужные компьютеры находятся в отдельной организационной единице:

Далее, для каждого компьютера в переменной используем такую команду 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

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

На самом деле механизм вывода еще запутаннее. Как вы помните, результатом работы 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.

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