Что такое Windows PowerShell и с чем его едят? Часть 1: основные возможности
Windows PowerShell позволяет системным администраторам автоматизировать большинство рутинных задач. С ее помощью можно менять настройки, останавливать и запускать сервисы, а также производить обслуживание большинства установленных приложений. Воспринимать синее окошко как еще один интерпретатор команд было бы неправильно. Такой подход не отражает сути предложенных корпорацией Microsoft инноваций. На самом деле возможности Windows PowerShell гораздо шире: в небольшом цикле статей мы попробуем разобраться, чем решение Microsoft отличается от более привычных нам средств.
Основные возможности
Разумеется Windows PowerShell — это в первую очередь командная оболочка с языком сценариев, изначально созданная на основе платформы .NET Framework, а позднее — на .NET Core. В отличие от принимающих и возвращающих текстовые данные оболочек, Windows PowerShell работает с классами .NET, у которых есть свойства и методы. PowerShell позволяет выполнять обычные команды, а также дает доступ к объектам COM, WMI и ADSI. В ней используются различные хранилища, вроде файловой системы или реестра Windows, для доступа к которым созданы т.н. поставщики (providers). Стоит отметить возможность встраивания исполняемых компонентов PowerShell в другие приложения для реализации различных операций, в т.ч. через графический интерфейс. Верно и обратное: многие приложения для Windows предоставляют доступ к своим интерфейсам управления через PowerShell.
Windows PowerShell позволяет:
- Менять настройки операционной системы;
- Управлять службами и процессами;
- Настраивать роли и компоненты сервера;
- Устанавливать программное обеспечение;
- Управлять установленным ПО через специальные интерфейсы;
- Встраивать исполняемые компоненты в сторонние программы;
- Создавать сценарии для автоматизации задач администрирования;
- Работать с файловой системой, реестром Windows, хранилищем сертификатов и т.д.
Оболочка и среда разработки
Существует Windows PowerShell в двух ипостасях: помимо эмулятора консоли с командной оболочкой есть интегрированная среда сценариев (Integrated Scripting Environment — ISE). Чтобы получить доступ к интерфейсу командной строки достаточно выбрать соответствующий ярлык в меню Windows или запустить powershell.exe из меню «Выполнить». На экране появится синее окошко, заметно отличающееся по возможностям от допотопного cmd.exe. Там есть автодополнение и другие фишки, привычные пользователям командных оболочек для Unix-систем.

Для работы с оболочкой нужно запомнить некоторые сочетания клавиш:
- Стрелки вверх и вниз прокручивают историю для повтора ранее набранных команд;
- Стрелка вправо в конце строки перенабирает предыдущую команду посимвольно;
- Ctrl+Home удаляет набранный текст от позиции курсора до начала строки;
- Ctrl+End удаляет текст от курсора до конца строки.

Windows PowerShell ISE является полноценной средой разработки с поддерживающим вкладки и подсветку синтаксиса редактором кода, конструктором команд, встроенным отладчиком и другими программистскими радостями. Если в редакторе среды разработки после имени команды написать знак дефис, вы получите в выпадающем списке все доступные параметры с указанием типа. Запустить PowerShell ISE можно либо через ярлык из системного меню, либо с помощью исполняемого файла powershell_ise.exe.

Командлеты
В Windows PowerShell появились т.н. командлеты (cmdlets). Это специализированные классы .NET, в которые заложена разнообразная функциональность. Именуются они по принципу «Действие-Объект» (или «Глагол-Существительное, если вам так больше нравится), а разделенная дефисом связка напоминает сказуемое и подлежащее в предложениях естественных языков. Например, Get-Help буквально означает «Получить-Помощь» или в контексте PowerShell: «Показать-Справку». По сути это аналог команды man в Unix-системах и мануалы в PowerShell нужно запрашивать именно так, а не вызывая командлеты с ключом —help или /. Не стоит забывать и об онлайн-документации по PowerShell: у Microsoft она достаточно подробная.
Помимо Get в командлетах для обозначения действий используются и другие глаголы (и не только глаголы, строго говоря). В списке ниже мы приведем несколько примеров:
Add — добавить;
Clear — очистить;
Enable — включить;
Disable — выключить;
New — создать;
Remove — удалить;
Set — задать;
Start — запустить;
Stop — остановить;
Export — экспортировать;
Import — импортировать.
Есть системные, пользовательские и опциональные командлеты: в результате выполнения все они возвращают объект или массив объектов. К регистру они не чувствительны, т.е. с точки зрения интерпретатора команд нет разницы между Get-Help и get-help. Для разделения используется символ ‘;’, но ставить его обязательно только если в одной строке выполняется несколько командлетов.
Командлеты Windows PowerShell группируются в модули (NetTCPIP, Hyper-V и т.д.), а для поиска по объекту и действию существует командлет Get-Command. Показать справку по нему можно так:

По умолчанию команда отображает краткую справку, но в командлеты при необходимости передаются параметры (аргументы). С их помощью можно, например, получить детальную (параметр -Detailed) или полную (параметр -Full) справку, а также вывести на экран примеры (параметр -Examples):
Справка в Windows PowerShell обновляется командлетом Update-Help. Если строка команд получается слишком длинной, аргументы командлета можно перенести на следующую, написав служебный символ ‘`’ и нажав Enter — просто закончить писать команду на одной строке и продолжить на другой не получится.
Ниже приведем несколько примеров распространенных командлетов:
Get-Process — показать запущенные в системе процессы;
Get-Service — показать службы и их статус;
Get-Content — вывести содержимое файла.
Для часто используемых командлетов и внешних утилит в Windows PowerShell есть короткие синонимы — алиасы (от англ. Alias). Например, dir — алиас Get-ChildItem. Есть в списке синонимов и аналоги команд из Unix-систем (ls, ps и т.д.), а командлет Get-Help вызывается командой help. Полный список синонимов можно посмотреть с помощью командлета Get-Alias:

Сценарии, функции, модули и язык PowerShell
Скрипты Windows PowerShell хранятся в виде обычных текстовых файлов с расширением .ps1. Запустить их двойным кликом нельзя: нужно правой кнопкой мыши вызвать контекстное меню и выбрать пункт «Запустить в PowerShell». Из консоли придется либо указать полный путь к скрипту, либо перейти в соответствующий каталог и написать имя файла. Запуск сценариев также ограничен системной политикой, а для проверки текущих настроек можно использовать командлет Get-ExecutionPolicy, который выдаст одно из следующих значений:
Restricted — запуск сценариев запрещен (по умолчанию);
AllSigned — разрешен только запуск подписанных доверенным разработчиком сценариев;
RemoteSigned — разрешен запуск подписанных и собственных сценариев;
Unrestricted — разрешен запуск любых сценариев.
У администратора есть два варианта действий. Наиболее безопасный предполагает подписание скриптов, но это довольно серьезное колдунство — мы будем разбираться с ним в следующих статьях. Сейчас пойдем по пути наименьшего сопротивления и поменяем политику:

PowerShell для этого придется запустить от имени администратора, хотя с помощью специального параметра можно изменить политику и для текущего пользователя.
Пишутся скрипты на объектно-ориентированном языке программирования, команды которого именуются по тому же принципу, что и рассмотренные ранее командлеты: «Действие-Объект» («Глагол-Существительное»). Основное его предназначение — автоматизация задач администрирования, но это полноценный интерпретируемый язык, в котором есть все необходимые конструкции: условный переход, циклы, переменные, массивы, объекты, обработка ошибок и т.д. Для написания сценариев годится любой текстовый редактор, но удобнее всего запустить Windows PowerShell ISE.
В скрипт можно передавать параметры, делать их обязательными, а также задавать значения по умолчанию. Кроме того Windows PowerShell позволяет создать функции и вызывать их точно так же, как и командлеты: для этого используется конструкция Function и фигурные скобки. Сценарий с функциями называется модулем и имеет расширение .psm1. Модули должны храниться в каталогах, определенных в переменных окружения PowerShell. Посмотреть их можно при помощи следующей команды:
Конвейеры
В последнем примере мы применили знакомую пользователям оболочек для Unix-систем конструкцию. В Windows PowerShell вертикальная черта также позволяет передать выход одной команды на вход другой, но в реализации конвейера есть и существенная разница: речь здесь идет уже не о наборе символов или каком-то тексте. Встроенные командлеты или пользовательские функции возвращают объекты или массивы объектов, а также могут получать их на входе. Как в Bourne shell и его многочисленных последователях, в PowerShell с помощью конвейера упрощается выполнение сложных задач.
Простейший пример конвейера выглядит так:

Сначала выполняется командлет Get-Service, а потом все полученные им службы передаются на сортировку по свойству Status командлету Sort-Object. В какой именно аргумент передается результат работы предыдущего участка конвейера, зависит от его типа — обычно это InputObject. Подробнее этот вопрос будет рассматриваться в посвященной языку программирования PowerShell статье.
При желании цепочку можно продолжить и передать результат работы Sort-Object еще одному командлету (выполняться они будут слева направо). Кстати, пользователям Windows доступна и привычная всем юниксоидам конструкция для постраничного вывода:
Запуск задач в фоновом режиме
Довольно часто бывает нужно запустить некую команду в фоне, чтобы не дожидаться результата ее выполнения в сессии оболочки. В Windows PowerShell есть несколько командлетов на такой случай:
Start-Job — запуск фоновой задачи;
Stop-Job — остановка фоновой задачи;
Get-Job — просмотр списка фоновых задач;
Receive-Job — просмотр результата выполнения фоновой задачи;
Remove-Job — удаление фоновой задачи;
Wait-Job — перевод фоновой задачи обратно в консоль.
Для запуска фоновой задачи мы используем командлет Start-Job и в фигурных скобках указываем команду или набор команд:

Фоновыми задачами в Windows PowerShell можно манипулировать, зная их имена. Для начала научимся их отображать:

Теперь покажем результат работы задания Job1:

Всё довольно просто.
Удаленное выполнение команд
Windows PowerShell позволяет выполнять команды и сценарии не только на локальном, но и на удаленном компьютере и даже на целой группе машин. Для этого существует несколько способов:
- У многих командлетов есть параметр -ComputerName , но таким способом не получится, например, создать конвейер;
- Командлет Enter-PSSession позволяет создать на удаленной машине интерактивный сеанс;
- С помощью командлета Invoke-Command можно выполнять команды или сценарии на одном или нескольких удаленных компьютерах.
Версии PowerShell
С момента первого релиза в 2006 году PowerShell серьезно изменился. Инструмент доступен для множества систем, работающих на разных аппаратных платформах (x86, x86-64, Itanium, ARM): Windows XP, Windows Server 2003, Windows Vista, Windows Server 2008/2008 R2, Windows 7, Windows 8, Windows 8.1, Windows RT, Windows RT 8.1, Windows Server 2012/2012 R2, Windows 10, Windows Server 2016, GNU/Linux и OS X. Последний релиз 6.2 выпущен 10 января 2018 года. Написанные для более ранних версий скрипты с высокой вероятностью будут работать в более поздних, а вот с обратным переносом могут возникнуть проблемы, поскольку за годы развития в PowerShell появилось большое количество новых командлетов. Узнать версию установленной на компьютере командной оболочки можно с помощью свойства PSVersion встроенной переменной $PSVersionTable:

Также можно воспользоваться командлетом:

То же самое делается и с помощью командлета Get-Host. На самом деле вариантов множество, но для их применения нужно изучить язык программирования PowerShell, чем мы и займемся в следующей статье.
Итоги
Корпорации Microsoft удалось создать действительно мощную командную оболочку с удобной интегрированной средой для разработки скриптов. От привычных нам по миру Unix средств ее отличает глубокая интеграция с операционными системами семейства Windows, а также с программным обеспечением для них и платформой .NET Core. PowerShell можно назвать объектно ориентированной оболочкой, потому что командлеты и пользовательские функции возвращают объекты или массивы объектов и могут получать их на входе. Думаем, этим инструментом должны владеть все администраторы серверов на Windows: прошло время, когда они могли обойтись без командной строки. Продвинутая консольная оболочка особенно необходима на наших недорогих VPS, работающих под управлением Windows Server Core, но это уже совсем другая история.
Занимательный PowerShell
PowerShell — это средство автоматизации от компании Microsoft с открытым исходным кодом, которое поддерживается в Windows, Linux, MacOS и даже под ARM. Представляет из себя объектно-ориентированный программный движок и скриптовый язык с интерфейсом командной строки.
Обладает обширными возможностями и позволяет решать практически любые задачи администрирования. Благодаря тесной интеграции с платформой .NET позволяет использовать все ее возможности. А огромное сообщество гарантирует большое количество готовых скриптов и модулей на любой вкус, цвет, платформу и требования. Из-за всего этого имеет достаточно большую распространенность и сферу применения.
Фактически, статья показывает как начать разработку скриптов на PowerShell, с каких материалов можно начать и дает примеры скриптов для старта.
Упор был сделан на контекст платформы 1С (но есть информация и по SQL Server, PostgreSQL и общим вопросам администрирования), чтобы показать наличие уже готовых инструментов для решений администрирования и не уходить с головой в “около1Сные” скриптовые движки. Не мучайте администраторов, развивайтесь, коллеги! Становитесь частью экомистемы и команды, а не отдельным изолированным миром, тогда и наладяться отношения системных администраторов и разработчиков 1С.
Немного об установке
Процесс установки PowerShell различается в зависимости от ОС, ее версии и т.д. Подробнее об установке и обновлении текущих версий рекомендую посмотреть официальную документацию.
Стоит отметить, что в операционной системе Windows есть встроенный движок “Windows PowerShell”, который уже немного отстает от актуальных версий. Иногда можно встретить путаницу между Windows PowerShell и актуальной версией PowerShell, которая выпускается уже в кроссплатформенном варианте. Все примеры скриптов ниже тестировались именно на Windows PowerShell, но все новые разработки и скрипты стараюсь делать на актуальных версиях PowerShell, что и Вам рекомендую.
Подробно расписывать шаги установки смысла нет — посмотрите ссылку выше. Там подробная инструкция как для Windows, так и для Linux.
Инструментарий
Еще немного хотелось бы сказать об инструментах для работы с PowerShell. В составе Windows с древних времен идет среда разработки “Windows PowerShell ISE”, которой, конечно, можно пользоваться и сейчас. Но даже по внешнему виду можно понять, что она достаточно архаично выглядит, да и большинства удобств современных IDE там просто не найти. Поэтому лучший выбор — это использование Visual Studio Code.
Достаточно установить расширение “PowerShell” и Вы получите отладку, удобный редактор с автоподсказками и многое другое. В статье “Использование Visual Studio Code для разработки в PowerShell” можно найти подробное описание что и как устанавливать, чтобы получить рабочую среду разработки. Также там есть описание дополнительных шагов настройки, которые в некоторых случаях могут понадобиться. Все вышесказанное актуально как для Windows, так и для Linux.
Еще немного слов про терминал. Как известно, в Windows работа с терминалом всегда была не очень удобной. Но с появлением Windows Terminal ситуация изменилась, хоть еще и есть куда стремиться. Теперь, как минимум, мы можем открывать несколько терминалов в одном окне и с разным типом. Вот, например, сразу один терминал PowerShell, два под Linux (через подсистему WSL) и один это старый добрый CMD.

Под Linux список инструментов для работы с терминалом намного больше и сами инструменты функциональней. Для себя использую простой терминал Gnome. Вот можете выбрать себе более подходящий.
Спектр задач
И целой книги не хватит, чтобы описать и пройтись по всему спектру задач, которые решает PowerShell. Но мы и не собирались. Ниже приведено несколько скриптов, которые позволяют примерно понять что и зачем можно делать. Также они могут быть стартовой точкой для начала написания собственных скриптов или целых решений автоматизации.
Это лишь примеры скриптов, не являющиеся готовым решением, поэтому они не оформляются в какой-либо отдельный модуль или пакет. Скорее всего в Вашей ситуации их придется дорабатывать.
Установка и настройка 1С
Начнем с простого — списка установленных версий 1С и команда установки.
Список установленных версий платформы
Из реестра Windows можно узнать список всех установленных версий 1С (32 и 64 битных).
Теперь мы можем легко получить список установленных версий платформы 1С на хосте.
Установка одной командой
Как известно, установщики приложений от 1С имеют возможность запуска с указанием параметров в командной строке. Воспользуемся этим.
Примерно этот же способ используют для установки 1С на множестве компьютеров, только каталог с установщиком находится в сетевом каталоге. Но вариантов установки, конечно же, много.
Проще простого, не так ли?
Управление службой
Частой задачей может быть перезапуск службы 1С или по крайней мере просмотр их списка.
Список установленных служб с информацией
Просто получим список установленных служб Windows, где файл приложения “ragent.exe”. Искать службу по имени не всегда надежно, ведь их могут зарегистрировать вручную под любым именем.
Теперь у нас есть список с именем службы, ее состоянием и командой запуска.
Запуск, остановка, перезапуск
И еще несколько примеров скриптов. Первый — это запуск остановленных служб 1С.
Далее остановка запущенных служб.
И, конечно же, перезапуск.
Ничего особого тут нет, ничего сложного.
Старый, добрый COM
До сих пор с 1С во многих компаниях работа выполняется через COM, в том числе и с сервером 1С. Вот несколько команд в помощь для работы с COM.
Проверка регистрации COM
Проверяем наличие зарегистрированных COM-объектов в системе для платформы 8.2 и 8.3.
Проверяются только компоненты, зарегистрированные по стандартному имени.
Регистрация COM
Еще один скрипт — это регистрация COM-компоненты. Будьте осторожны, т.к. здесь выполняется регистрация для всех установленных служб 1С. Обычно она одна и поэтому будет зарегистрирована только одна компонента. Но мало ли что у Вас на сервере…
Не забывайте запускать скрипт с правами администратора для успешной регистрации COM.
Отмена регистрации COM
Аналогичная ситуация при отмене регистрации COM.
Также необходимы права администратора.
COM с нами еще надолго 🙂
Кластер под контролем
Еще немного о взаимодействии с кластером 1С.
Информация о кластере
Получим немного информации о кластере 1С без COM, только по данным службы Windows.
Теперь мы можем получить имя службы, состояние, версию платформы, путь к каталогу кластера 1С, используемые порты и каталог кластера.
Регистрация и запуск консоли кластера
Бывает ли у Вас такое, что используется несколько версий 1С и необходимо запускать консоль администрирования серверов 1С разных версий? Этот скрипт должен помочь.
Для регистрации компонентов нужны права администратора. А куда без них…
Завершаем все сеансы
Пример скрипта, который завершит все сеансы 1С на сервере. Взаимодействие происходит через COM.
Будьте осторожны при запуске. Не сбросьте сеансы в рабочей базе в рабочее время 🙂
Очистка сеансовых данных
Периодически приходится чистить каталог сеансовых данных, особенно если встречаются непонятные “глюки” в работе сервера 1С.
COM не нужен, но права администратора все равно нужны для остановки и запуска служб.
Блокировка всех информационных баз
Еще один пример работы через COM — блокировка работы со всеми информационными базами.
Не забудьте отправить SMS на указанный номер в примере скрипта 🙂
Ну а для снятия блокировки можно использовать следующий скрипт.
Контроль размера данных кластера
Еще один простой скрипт для получения размера сеансовых данных сервера 1С.
Может пригодиться для отслеживания работы сервера.
Сохраняем информацию о сеансах в базу PostgreSQL
Многие системы мониторинга сохраняют информацию о сеансах. Следующие скрипты делают это, отправляя данные в базы данных PostgreSQL. Этот для сеансов.
Внутри скрипта также команды для создания базы данных.
Сохраняем информацию о рабочих процессах в базу PostgreSQL
А это скрипт для рабочих процессов.
Принцип тот же, что и для сеансов.
Прочь COM, да здравствует RAC
Работа через COM в какой-то мере устарела и все скрипты относятся теперь к легаси. Эффективнее теперь все подобные действия выполнять через RAC.
Общий пример работы с RAC
Вот пример скрипта для блокировки выполнения фоновых заданий для информационных баз.
Для других действий необходимо изучить документацию по RAC.
Только не заставляйте переписать все скрипты с COM на RAC 🙂
Запуск 1С
Пару лет назад был выпущен модуль “1C.Utils”. Там есть хороший скрипт для запуска приложений 1С.
Жаль, что модуль больше не обновляется, но даже эти наработки можно использовать.
Великий SQL Server
Для работы со SQL Server также есть огромный функционал. Работу можно выполнять через ODBC, SMO и многими другими путями. Ниже два небольших примера.
Пример работы с модулем DBATools
Здесь мы будем использовать готовый модуль DBATools, о возможностях которого нам не хватит и целой статьи рассказать.
[На официальной странице] п(https://dbatools.io/)роекта Вы можете найти все что нужно.
Пример создания сжатой тестовой базы со скрытым shrink’ом
Еще один пример работы, но уже с помощью SMO. Здесь мы создаем копию базы данных с включенным сжатием PAGE. Может пригодиться для создания тестовых баз.
У такого подхода есть и еще один плюс — не нужно делать шринк, т.к. данные с нуля создаются в копии базы. Поэтому пустого зарезервированного места в файле данных просто не будет.
Капля в море, но нужно же с чего-то начинать 🙂
Совсем немного PostgreSQL
Для работы с PostgreSQL также можно использовать PowerShell, даже если установка выполнена на Linux. Следующий скрипт показывает простейший вызов команд с помощью psql.
Фишкой здесь является установка пароля пользователя, от которого выполняется обращение к СУБД, т.к. psql не имеет такого параметра явно. В остальном ничего сложного.
Можно выполнять множество других действий, но для примера оставим только этот скрипт.
Вызов стороннего API
Часто приходится иметь дело с различными REST-сервисами:
- Проверять их доступность
- Управлять учетными записями
- Автоматизировать настройку
- И др.
В этом случае с помощью PowerShell также можно решать поставленные задачи.
Пример вызова API сервера Zabbix
Например, с помощью следующего скрипта можно проверить доступность API сервера Zabbix.
Аналогично можно обращаться к любым REST-сервисам. Главное формировать запрос с учетом их требований.
Подобная тема актуальная и при работе с облаками (Azure, AWS и др.) или любыми другими сервисами.
Собственный бот
Использование мессенджеров для уведомления о важных событиях мониторинга трудно переоценить. Ниже скрипт для отправки сообщений в Telegram.
Отправка сообщений в Telegram
Для отправки сообщений достаточно знать ID бота и идентификатор чата.
В результате сообщение будет отправлено и важное событие не будет пропущено. Вот служебные функции из скрипта выше.
Очень удобно с этим работать, если оформить в модуль. Но это уже другая история.
Есть решения и для других мессенджеров (WhatsApp, Viber и т.д.), но рассматривать их сейчас не будем.
Отправка писем
Электронная почта также до сих пор остается важным инструментом коммуникаций. Отправка туда сообщений иногда является самым универсальным способом уведомлений, ведь не все предпочитают одинаковые мессенджеры. А вот почта, по крайней мере корпоративная, есть почти всегда.
Отправка писем через Yandex.Mail
Этот скрипт отправляет почту через сервис Yandex.Mail.
У Яндекс есть различные ограничения, о которых стоит прочитать в документации. Например, двухфакторная аутентификация уже не позволит таким способом отправлять почту. Есть и другие нюансы.
А Вы используете электронную почту для уведомлений?
Контролируй процессы
Часто приходится управлять различными процессами в системе. Например, завершить зависшие процессы или узнать потребляемые ими ресурсы. Тут то на сцену выходит PowerShell 🙂
Список процессов
Примеры команд для получения информации о процессах различными способами.
Убить нельзя помиловать
Кроме получения информации о процессах нужно еще и уметь их останавливать.
В первом примере выполняется остановка процессов по имени. Во втором остановка процессов, которые не отвечают. А третий пример наиболее интересен — завершаются процессы, во время выполнения которых появилась ошибка вида “Visual C++ Runtime Library”.
Вот такие процессы и будут завершены.
Имей власть над процессами и будешь властвовать над ОС 🙂
Проверка свободного порта
Почти каждый сталкивался с проблемой, когда служба 1С могла не запускаться из-за занятого порта другим приложением. Для диагностики нужно проверить кто нужный порт занял. Тут на сцену выходит…
Свободный ли порт?
С помощью скрипта можно узнать кто и как занял порт.
Главное раскомментировать нужное условие для фильтрации результата.
Теперь можно не гадать, почему служба 1С не запустилась 🙂
Удаленное управление
PowerShell позволяет выполнять скрипты / команды на удаленных машинах, что значительно упрощает решение задач администрирования. Решается это с помощью PSRemoting. Ранее все удаленные взаимодействия выполнялись через WinRM, теперь же появилась возможность работать и через SSH.
Ниже пример настройки для Windows и выполнение удаленной команды.
Простейший пример настройки
На обоих машинах нужно обязательно установить PowerShell и включить удаленное управление. Ниже пример скрипта для настройки.
Нужно учитывать, что это лишь пример скрипта, который не годится для рабочего окружения.
Как использовать
После настройки можно выполнять любой скрипт на удаленной машине. Ниже пример перезапуска удаленного хоста.
Никто не мешает удаленно выполнить любой скрипт из тех, что были показаны выше.
Один PowerShell, чтоб править всеми … хостами.
Еще еще еще
На этом примеры скриптов закончим. Многие другие скрипты и примеры можно найти в таких источниках:
-
— набор публичных скриптов под разные задачи. — еще один репозиторий со скриптами.
А теперь пойдем дальше.
Меньше костылей
Создавать свои скрипты — это нормально, но некоторые задачи уже были решены до нас и мы можем этот опыт использовать. В контексте PowerShell это либо использовать скрипты других разработчиков, либо брать на вооружение целые готовые модули PowerShell от сообщества или компаний (обычно выпускают вместе с каким-либо продуктом, как это делает та же Microsoft).
Planet PowerShell и PowerShell.org — сообщество разработчиков PowerShell.
PoweShell Galery — галерея готовых скриптов и решений на PowerShell. В разделе просмотра списка пакетов Вы можете найти такие популярные модули как:
-
— модуль автоматизации работы со SQL Server. — инструменты для управления Active Directory. — удобный инструмент для формирования запросов к разным СУБД (SQL Server, PostgreSQL, Oracle и др.).
И очень много всего еще.
Есть даже 1C.Utils (о нем говорили выше) — небольшой набор инструментов для 1С, правда автор забросил его пару лет назад, а жаль.
В общем, готовых решений много, а участников сообщества еще больше!
В самом конце
Все что я хотел сказать в этой статье, так это недооцененный инструмент для решения повседневных задач — PowerShell. Недооцененный именно в среде разработчиков 1С, тогда как в мире .NET, CI/CD и для управления некоторых облачных решений — PowerShell занял хорошие позиции.
Вместо использования готовых решений, сообщество и сама фирма “1С” пошли своим путем, создавая собственные инструменты автоматизации. Причем фирма “1С” проигнорировала труды сообщества в виде OneScript и создает собственный инструмент — 1С:Исполнитель.
Конечно, чем больше инструментов, тем лучше. Но средства автоматизации создаются не только для разработчиков 1С, но и для администраторов, DevOps’ов и других специалистов, которые могут и не иметь прямого отношения к 1С. А если администратору нужно будет автоматизировать процесс разворачивания клиентов 1С, сбор информации с сервера 1С или другую задачу автоматизации, то зачем ему изучать OneScript или 1С:Исполнитель? А ставить для их работы дополнительные компоненты, о которых в не1Сном сообществе не слышали и не могут доверять им.
Автор не противник OneScript или 1С:Исполнитель. Я фанат PowerShell и немного Bash. Понимаю, что коллеги проделали большую работу и продукт взлетел в определенном смысле. Но может сообществу 1С пора быть более открытым и не замыкаться свою экосистему саму на себя?
PowerShell для чайников: что это и как с ним работать
Рассказываем о языке программирования, с помощью которого можно творить чудеса в Windows (и не только).


Иллюстрация: Francesca Tosolini / Unsplash / Annie для Skillbox Media

Рядовые пользователи общаются со своими ПК через графический интерфейс: нажимают иконки и кнопки, переключаются между окнами и вкладками.
А системные администраторы используют для этого командную строку. Чтобы компьютер понимал их указания, интерпретатор, он же командная оболочка, переводит всё на машинный язык.
Есть десятки оболочек под разные нужды, предпочтения и операционные системы. В Linux обычно используют Bash, в macOS по умолчанию установлен Zsh, а для Windows (но не только) есть PowerShell.
Из статьи вы узнаете:
Что такое Windows PowerShell
Windows PowerShell — это одновременно командная оболочка и язык сценариев, основанный на .NET. PowerShell используют для управления компьютером и автоматизации задач. Это полноценный объектно-ориентированный язык, в котором есть переменные, функции, классы и объекты.
В отличие от других командных оболочек, PowerShell работает не со строками, а с объектами. Благодаря этому можно создавать сложную логику. При этом интерпретатор полностью совместим со стандартными командами cmd.exe и может выполнять их.
Команды пишут в интерактивном режиме внутри терминала. Но если вы хотите сохранить какой-то часто используемый скрипт, удобнее использовать ISE.
Windows PowerShell ISE — это интегрированная среда сценариев для PowerShell. В ней можно писать, сохранять и запускать скрипты, есть подсветка синтаксиса, автодополнение, справочник команд и инструменты отладки. PowerShell ISE — легаси-инструмент, он работает для версии языка 5.1 и ниже. Для более поздних обновлений используют IDE общего назначения с плагинами.
С 2016 года язык стал кросс-платформенным. Его можно использовать не только в Windows, но и в macOS (начиная с версии 10.13) и популярных дистрибутивах Linux (каких именно, можно узнать в документации).
Как открыть PowerShell в Windows
Обычно PowerShell предустановлен по умолчанию. Но если у вас его нет, можете воспользоваться инструкцией от Microsoft. Также в документации есть руководства по установке для macOS и Linux.
PowerShell не зависит от версии операционной системы и одинаково работает как на Windows 10, так и на Windows Server.
Есть два основных способа открыть PowerShell или PowerShell ISE в Windows: меню «Пуск» и приложение «Выполнить».
В меню «Пуск» долистайте до папки Windows PowerShell, откройте её и выберите нужное приложение. Здесь есть 32-разрядные (у них х86 в скобках) и 64-разрядные версии терминала и ISE.

Приложение «Выполнить» открывается сочетанием клавиш Win + R. В появившемся окне введите powershell или powershell ise (в зависимости от того, что вам нужно) и нажмите ОК.

Команды (командлеты) PowerShell
Команды в PowerShell называются командлетами (от английского cmdlet). Все они состоят из связки «Глагол-Существительное», или по-другому «Действие-Объект». Например, Get-Services и Start-Process. Благодаря такой структуре можно понять назначение команды, даже если вы с ней ещё не сталкивались.
Синтаксис командлетов
После самого командлета ему передаются параметры и их значения. Между всеми словами в команде ставится пробел. Вот пример синтаксиса команды, чтобы перейти в каталог C:\:

- Set-Location — буквально «установить местоположение». Переходит в нужный каталог.
- -LiteralPath C:\ — в этом параметре мы прописываем путь до каталога, в который хотим перейти. У командлета Set-Location это аргумент по умолчанию, поэтому -LiteralPath можно не прописывать отдельно: Set-Location C:\ -Passthru сработает точно так же.
- -PassThru — обычно командлет Set-Location просто меняет местоположение и ничего не возвращает. Этот параметр говорит, что нужно вывести на экран расположение каталога, в который мы перешли.
При этом в PowerShell не важен регистр. Эту же команду можно записать только заглавными буквами, только строчными и даже «лесенкой» — она всё равно сработает.

Если в одной строке написаны сразу несколько команд, они разделяются точкой с запятой ;.
Иногда команда может получиться слишком длинной. Чтобы разбить её на несколько строк, в месте переноса ставится гравис `. Создать новую строку можно сочетанием клавиш Shift + Enter (появится ниже текущей) или Ctrl + Enter (появится выше текущей).
Разделим предыдущую команду:

Совет
Стрелки вверх и вниз позволяют прокручивать историю команд, которые вы вводили. Это удобно, если нужно выполнить одну из предыдущих команд ещё раз или внести в неё небольшие изменения.
Алиасы
При работе с терминалом в интерактивном режиме бывает неудобно каждый раз вводить полные названия командлетов. Поэтому у самых распространённых есть псевдонимы, или алиасы, — их сокращённые версии.
Получить список доступных алиасов можно командой Get-Alias (у неё тоже есть свой псевдоним — gal).

Чтобы узнать список алиасов для отдельного командлета, воспользуйтесь параметром -Definition. Например:

Если вы по алиасу хотите узнать полное название командлета, примените параметр -Name. Это аргумент по умолчанию, поэтому писать его необязательно.

Особенности пути до каталога
Многим командлетам для работы нужно передать путь до файла или каталога. Делается это в виде строки, например: C:\Windows\System32.
Но если в этом адресе встретится пробел или другой спецсимвол, PowerShell воспримет его как разделитель. Например:

PowerShell «видит» пробел и думает, что путь до папки закончился на слове Program, а files — это уже значение какого-то другого параметра.
Есть два способа избежать таких ситуаций:
- Экранировать проблемные символы обратным грависом `: C:\Program` Files. Если путь длинный, то это может быть неудобно.
- Поместить весь путь в одинарные или двойные кавычки: ‘C:\Program Files’ или «C:\Program Files» (лучше одинарные).
Также в PowerShell есть сокращения для быстрого доступа к ближайшим директориям:
- Точка . указывает на текущий каталог. Например, Get-ChildItem . позволяет посмотреть все папки и файлы в нынешнем местоположении.
- Две точки .. указывают на родительский каталог. Например, Set-Location .. позволяет быстро к нему перейти. Это может быть полезно, если вы находитесь где-то в глубоко вложенной директории.
У многих командлетов есть сразу два параметра, в которых можно указать путь до папки или файла: -Path и -LiteralPath. Разница между ними в том, что в -Path можно подставлять переменные, а -LiteralPath воспринимает символы буквально, даже если в них указано имя переменной. О переменных в PowerShell мы рассказываем ниже.
Get-Help: как изучать новые командлеты
Чтобы узнать подробную информацию о командлете, используйте Get-Help Название-Командлета. Например:

У Get-Help есть несколько полезных параметров:
- -Detailed даёт более детальную справку.
- -Full даёт полную справку.
- -Examples приводит примеры использования командлета.
- -Online перенаправляет на веб-страницу с документацией.
Объекты и конвейеры (пайплайны)
Командлеты PowerShell возвращают в терминал не строки, а объекты — структуру данных с набором свойств и методов . Подробно об объектах можно прочитать в нашей статье.
Строка, которую вы видите в терминале после выполнения команды — только визуальное представление объекта. PowerShell в виде таблицы показывает некоторые свойства, но не все.
Так же, как командлеты возвращают объекты, они могут принимать и обрабатывать их. Можно написать команду, на выходе получить объект, передать его другому командлету, получить объект уже от него, передать — и так до бесконечности. Это и есть конвейеры, или пайплайны.
Чтобы передать результат командлета другому командлету, между ними ставят вертикальную черту |.
Работа конвейера на примере
Get-Process возвращает список процессов, запущенных на компьютере. Если передать ему название процесса (или шаблон, написанный с помощью регулярных выражений), командлет выведет только нужные элементы списка.
Вызовем запущенный процесс powershell.

Мы получили объект и таблицу с некоторыми его свойствами. Чтобы узнать все свойства и методы, передадим объект командлету Get-Member. Для этого нам и понадобится конвейер.

Get-Member получил объект от Get-Process и вывел таблицу со всем его содержимым. Результат работы Get-Member — тоже объект (вернее, список объектов), который можно передать по конвейеру дальше.
Например, мы хотим отобразить только те строки, в которых MemberType — это Property. Для этого используем командлет Where-Object.

Where-Object по очереди перебирает каждый объект, полученный от Get-Member. Выражение в фигурных скобках — логическое:
- $_ ссылается на текущий объект (то есть на отдельную строку в таблице);
- .MemberType обращается к значению свойства MemberType в этом объекте;
- -eq сравнивает, равно ли выражение слева от него выражению справа от него;
- ‘Property’ — это значение, которое мы ожидаем увидеть у свойства MemberType.
О логических выражениях мы рассказываем ниже.
Форматирование таблиц с помощью конвейеров
Командлет Format-Table позволяет настроить отображение таблицы, которую PowerShell выводит в терминале: выбрать свойства и методы, которые в ней будут, установить ширину столбцов, сгруппировать данные по нескольким таблицам и так далее.
Отформатируем таблицу, которую получили от командлета Get-Member.

Расшифруем параметры Format-Table:
- -AutoSize выравнивает ширину столбцов по размеру их содержимого;
- -Wrap переносит содержимое ячейки на следующую строку, если она не помещается в размеры экрана (по умолчанию текст обрезается);
- -GroupBy разделяет одну таблицу на несколько, сгруппированных по значению какого-либо свойства (в нашем случае для каждого MemberType создана отдельная таблица);
- -Property указывает, какие свойства объекта будут отображаться в таблице в качестве столбцов (в нашем случае Name и Definition).
Сортировка таблиц с помощью конвейеров
Командлет Sort-Object позволяет отсортировать список объектов (то есть таблицу) по значениям её свойств (то есть столбцов). Отсортируем результат работы GetMember по столбцу Name в алфавитном порядке. Для этого используем параметр -Property (работает как у Format-Table).

У Sort-Object есть и другие полезные параметры:
- -Descending сортирует объекты в порядке убывания.
- -Unique удаляет дубликаты и возвращает только уникальные объекты.
- -Top получает число N и отображает первые N объектов в таблице.
- -Bottom получает число N и отображает последние N объектов в таблице.
Фоновое выполнение команд
Некоторые задачи могут занимать много времени. Это, например, установка и обновление ПО, поиск файла в большой директории. Пока PowerShell выполняет одну команду, писать другие нельзя.
К примеру, попытаемся найти на всём диске C файл powershell.exe. Используем для этого командлет Get-ChildItem с параметром -Recurse. Так он будет искать не только в текущем каталоге, но и во всех подкаталогах.
PowerShell может попытаться зайти в папки, к которым у него нет доступа, поэтому добавим -ErrorAction SilentlyContinue. Если случится ошибка, команда не станет сообщать об этом и просто продолжит выполняться.

Как видим, пока задача не завершена, командная строка недоступна. Чтобы принудительно прервать её выполнение, нажмите сочетание клавиш Ctrl + C (при этом ничего не должно быть выделено, иначе компьютер воспримет это как команду «Копировать»).
Чтобы не ждать выполнения долгих задач и сразу приступать к следующим, их можно запускать в фоновом режиме. Делается это командлетом Start-Job, а сама команда помещается в фигурные скобки.

Одновременно можно выполнять любое количество фоновых задач. Помимо Start-Job для работы с фоновыми задачами есть другие командлеты:
- Get-Job выдаёт отчёт со статусом фоновых задач.
- Wait-Job делает консоль недоступной, пока выполняется фоновая задача.
- Stop-Job прерывает выполнение фоновой задачи.
- Receive-Job выводит результат фоновой задачи и удаляет его из памяти. Чтобы сохранить результат в памяти, используйте параметр -Keep.
Wait-Job, Stop-Job и Receive-Job ожидают, что вы примените их к конкретной задаче (или нескольким). Для этого укажите название Name или идентификатор Id. Делать это можно и в связке с Get-Job.

Работа в PowerShell ISE
Терминал PowerShell удобен для выполнения небольших коротких однострочных задач. Чтобы создавать и сохранять сложные скрипты, есть интегрированная среда сценариев.

Важно!
PowerShell ISE предназначен для версий языка 5.1 и младше. Для более старших версий Microsoft рекомендует использовать Visual Studio Code с расширением PowerShell.
PowerShell ISE состоит из трёх основных окон:
- область сценариев в верхней части экрана — в ней пишут скрипты;
- область консоли в нижней части экрана — работает так же, как обычный терминал, здесь можно писать команды в интерактивном режиме;
- панель команд в правой части экрана — полный справочник команд PowerShell с конструктором, в котором можно указать значения нужных параметров.
Комментарии в коде
PowerShell позволяет вставлять в код комментарии. Они никак не влияют на выполнение скрипта и нужны людям, которые будут читать вашу программу. Однострочный комментарий начинается с символа #, а многострочный обрамляется с двух сторон символами <# и #>.

Правила хорошего кода
Любой код чаще читают, чем пишут, и важно делать его понятным для человека. Разработчики PowerShell договорились между собой о едином своде правил и выпустили стайлгайд. Вот несколько правил оттуда.
Используйте нотацию PascalCase в названиях командлетов, функций, параметров, свойств, методов, переменных и классов. Неправильно писать: get-service, Get-service, GET-SERVICE. Правильно: Get-Service.
Пишите полные названия командлетов. Алиасы удобны для работы в интерактивном режиме, но в скриптах могут затруднять чтение команд. Неправильно: dir, gci, ls. Правильно: Get-ChildItem.
One True Brace Style при оформлении вложенности. Если вы где-то используете фигурные скобки, то код внутри них отбивается табуляцией (четыре пробела), а сами скобки ставятся так:
Исключение из прошлого правила — когда код в фигурных скобках совсем небольшой, его можно записать в одну строку. Например:
Комментируйте код. Так будет гораздо проще разобраться, что он делает и как работает. Причём как другому человеку, так и вам самим через полгода.
Запуск скриптов
В PowerShell ISE можно выполнить код целиком или частично, есть инструменты отладки. Скрипты сохраняются в файлах с расширением .ps1. Но запустить их двойным кликом не получится — нужно нажать правую кнопку мыши и в появившемся окне выбрать Выполнить с помощью PowerShell.
Также запустить скрипт можно из оболочки. Например, в каталоге C:\Scripts есть файл test_script.ps1. Выполнить его можно:
- командой PowerShell -File C:\Scripts\test_script.ps1, запущенной из любого места;
- командой .\test_script.ps1, запущенной, когда вы находитесь в каталоге C:\Scripts.
Политика выполнения
По умолчанию запускать любые файлы с PowerShell-скриптами запрещено. Сделано это в целях безопасности. Узнать нынешнюю политику выполнения можно с помощью командлета Get-ExecutionPolicy. Вот какая она может быть:
- Restricted (установлена по умолчанию) — запрещено запускать любые скрипты.
- AllSigned — разрешено запускать только скрипты, которые были подписаны доверенным разработчиком.
- RemoteSigned — разрешено запускать подписанные доверенным разработчиком и собственные скрипты.
- Unrestricted — разрешено запускать любые скрипты.
Чтобы ваши ps1-файлы запускались, нужно заменить политику выполнения на RemoteSigned. Для этого откройте PowerShell от имени администратора и выполните команду:
Чтобы подтвердить действие, введите y.

Переменные
Чтобы сохранять данные и обращаться к ним в будущем, в PowerShell есть переменные. Перед их названием ставится знак доллара $, а сами они могут содержать латинские буквы (заглавные и строчные), цифры и нижние подчёркивания.

Переменная может хранить данные любого типа, и их можно перезаписывать.

Переменную можно привести к определённому типу данных. Создадим переменную со строкой 2023 и преобразуем её в число. Чтобы узнать тип данных, воспользуемся методом .GetType().

Чтобы удалить переменную, используется метод .Clear().
Переменные можно подставлять в строки, если они оформлены двойными кавычками. Если же кавычки одинарные, то PowerShell воспринимает символы в строке буквально. Сравните:

Помимо пользовательских также есть системные переменные. Например, $PSVersionTable хранит информацию о версии PowerShell.

Логические операторы
PowerShell позволяет проводить с объектами арифметические операции и сравнивать их друг с другом. Для этого он использует логические операторы.
Арифметические операторы:
- + — сложение;
- — — вычитание;
- * — умножение;
- / — деление;
- % — деление по модулю ;
- ( и ) — скобки для группировки операций.
Операторы сравнения оформляются так же, как параметры командлетов. Их названия произошли от английских выражений, указанных в скобках.
- -eq — равно (от equal);
- -ne — не равно (от not equal);
- -gt — больше (от greater than);
- -ge — больше либо равно (от greater than or equal);
- -lt — меньше (от less than);
- -le — меньше либо равно (от less than or equal).
Условия
Условия в PowerShell создаются с помощью ключевых слов if, elseif и else. В обычных скобках указывается само условие, в фигурных — код, который запускается при его выполнении. Например:
Также условия можно задавать с помощью ключевого слова switch. Например:
Циклы
В PowerShell есть сразу несколько видов циклов:
-
(while); истинным (do while) и ложным (do until); (for); (foreach).
Их синтаксис похож на синтаксис условий: в круглых скобках указывается условие, в фигурных — блок кода.
Массивы, хеш-таблицы, функции и классы
PowerShell позволяет создавать и более сложные структуры данных и алгоритмы. Прочитать о них можно в документации PowerShell:
Резюмируем
Windows PowerShell — язык программирования, на котором администрируют операционные системы и автоматизируют процессы. Он поддерживает объектно-ориентированное программирование и позволяет работать в интерактивном режиме, а также писать, сохранять и выполнять полноценные скрипты.
Microsoft PowerShell
О программе
Что нового
Новое в PowerShell 7.3.4 :
Новое в PowerShell 7.1.5 :
Системные требования
PowerShell 7 в настоящее время поддерживает следующие 64-разрядные операционные системы.
- Windows 8.1 и 10 (включая ARM64)
- Windows Server 2012, 2012 R2, 2016 и 2019
- Ubuntu 16.04/18.04/20.04 (включая ARM64)
- Ubuntu 19.10 (через Snap)
- Debian 9/10
- Red Hat Enterprise Linux (RHEL) и CentOS 7
- Fedora 30 или более поздней версии
- Alpine Linux 3.11 или более поздней версии (включая ARM64)
- macOS 10.13 или более поздней версии
Полезные ссылки
Подробное описание
PowerShell является достойной многофункциональной заменой для стандартной командной строки Windows. С выходом версии 6, это консольное приложение доступно для пользователей Mac и Linux, а также включает расширенные функциональные возможности. Версию 7 называют «единый настоящий PowerShell», потому что она объединяет Windows PowerShell и PowerShell Core.
PowerShell – это новая кросплатформенная версия оболочки командной строки Windows. PowerShell имеет открытый исходный код и работает на платформе .NET Core, в отличии от предыдущих версий, работающих на .NET Framework. Приложение может получать доступ к функциям командной строки, COM-объектам и библиотекам классов .NET. Это расширяет возможности выполнения различных задач и администрирования системы.
Для упрощения работы и расширения возможностей, используются командлеты (cmdlets) – встроенные в PowerShell команды, выполняющие различные функции. PowerShell Core полностью совместим с Windows PowerShell и вы можете тестировать новые версии, параллельно с установленной рабочей версией.
Другие программы
Microsoft .NET Core
Компоненты для разработки и запуска приложений среды .NET Core
Windows Terminal
Терминал от Microsoft объединяет инструменты CMD, PowerShell и WSL


