Powershell скрипты
Доброго времени суток дорогие читатели. В данной статье мы познакомимся с основами Powershell. Данный язык программирования используется во всех ОС Microsoft начиная с Windows XP SP3. Писать Powershell скрипты должен уметь каждый уважающий себя системный администратор windows.
Все команды в Powershell как правило используются в форме командлетов. Все командлеты это специализированные классы .NET Framework и .NET Core (используется в PowerShell Core 6 и выше).
Powershell класса .NET Framework это версии с 1 по 5.1 а Powershell .NET Core это версия 6 и выше (на данный момент 7.0). По заявлению Microsoft новых функций в Powershell 5.1 (.NET Framework) вносить уже не будут. Однако 7 версия еще не полностью поддерживает все модули предыдущих версий. Но судя по всему Microsoft стремится к этому и скоро версия Core будет единственной. В общем cmd отходит в прошлое и теперь без Powershell никуда. Давайте приступим к практике. Так всегда лучше запоминается материал.
Запуск Powershell
На примере Windows 10 Powershell можно запустить просто нажав правой кнопкой мыши на меню пуск.
Также нижняя строчка позволяет запустить Powershell с повышенными правами администратора.
Еще можно воспользоваться поиском в WIndows 10 и ввести название powershell
Как видно на картинке выше нашелся не только Powershell но и Powershell ISE. Консоль powershell удобна если требуется запустить последовательно не больше одной команды. Либо несколько команд в конвейере. Однако в случае написания полноценных скриптов лучше использовать Powershell ISE. Это бесплатная среда разработки сценариев на языке Powershell поставляется вместе с ОС Windows.
Сразу после запуска консоли рекомендую запустить командлет Get-Help – встроенная справка по всем командлетам, аналог man в Linux.
Видим что консоль предлагает обновить встроенную помощь. Нажимаем Y и соглашаемся.
Командлеты
Командлеты – это название команд в Powershell. Каждый командлет реализует заложенную в него функциональность. Как правило наименование командлета состоит из пары: глагол-существительное. Например: Get-Help – получить помощь. Обычно Get используется чтобы получить информация, Set – внести изменение, New – создать новый объект, политику и т.п. и Remove -удалить объект, политику и т.п.
Командлеты не чувствительны к регистру. Написать Get или get не важно, powershell воспримет эти команды одинаково.
Чтобы получить список всех доступных командлетов необходимо использовать Get-Command
Для получения справки по любому командлету напишите Get-Help имя-комндлета. Например
Давайте представим что нам необходимо вывести список командлетов для управления процессами. Воспользуемся Get-Command и укажем ему параметры для более точного поиска.
И вот мы видим список командлетов позволяющих управлять процессами: Get-Process – список всех запущенных процессов, Start-Process – запустить указанный процесс, Stop-Process– остановить указанный процесс, Wait-Process – ожидать указанный процесс. Как видно из названий командлетов можно легко понять для чего каждый служит.
Используя командлет Get-Help можно получить справку по любому командлету.
При использовании командлета есть возможность указать несколько параметров при запуске. Первый параметр можно не называть. Выше я писал Get-Command *Process* где указал поиск командлетов со словом Process. Однако я не написал параметр -Name, хотя именно его и указал. Если полностью то поиск по имени выглядит так: Get-Command -Name *Process* . В случае отсутствия непосредственного указания -Name Powershell принимает в качестве имени введенное слово *Process*.
Давайте выведем список процессов с именем WhatsApp
Мы вывели все процессы с именем WhatsApp и добавили в вывод дополнительный параметр -IncludeUserName, что позволило нам увидеть кем запущен процесс.
Алиасы
Алиасы в Powershell это по сути более короткие названия командлетов. Т.е. любому командлету можно присвоить свое короткое имя (alias). Например алиасом для командлета Get-Process является gps. Согласитесь куда проще и быстрее написать gps чем Get-Process.
Список всех alias можно получить используя командлет Get-Alias
Как видно из списка для alias использованы аналогичные по значению команды из Linux: ls, man, mount, md, kill и т.п. Видимо чтобы линуксоиду было по привычнее 🙂 Можно создать свой alias используя командлет New-Alias
Конвейер
Конвейер используется для передачи выходных данных командлета идущего вначале во входные данные командлета следующего за ним. Ничего непонятно? 🙂 Давайте на примерах, так всегда яснее.
Возьмем уже известный нам командлет Get-Process, посмотрим на его вывод
Как по мне многовато лишних столбцов. Мне эта информация не нужна, поэтому я выберу только нужные данные. Для таких целей служит командлет Select-Object. Давайте используем его в конвейере.
Как вы уже наверно догадались конвейер обозначается знаком | и идет сразу следом за командлетом. И так данные по конвейеру можно передавать и дальше другим командлетам. Итак я передал выходные данные (список запущенных процессов) на вход командлета Select-Object. Который в свою очередь выбрал данные по 3 столбцам ID, CPU, ProcessName. Теперь можно передать эти данные дальше. Например выгрузить в текстовый файл
Просто не правда ли? У нас конвейер из трех командлетов, на выходе которого получаем текстовый файл со списком запущенных процессов и необходимой информацией по ним.
Структура объектов
В Powershell объекты играют самую важную роль. От типа объекта зависит что именно с ним можно сделать. Узнать тип объекта и вывести список всех его элементов позволяет команда Get-Member
Вот далеко не полный список элементов командлета Get-Process. В данному случае тип данных это System.Diagnostics.Process
Давайте посмотрим тип данных у новой переменной
В данном случае тип данных System.String т.е. строка. Что вполне логично. А теперь посмотрите что можно сделать с этой строкой с учетом указанных выше параметров.
Как видно на картинке выше мы заключаем нашу тестовую переменную $new в скобки и после них пишем точку и указываем метод. В примере я использовал три метода:
- ToUpper – перевод всех букв в строке в верхний регистр
- ToLower – перевод всех букв в строке в нижний регистр
- Length – подсчитать количество символов в строке
Это всего лишь небольшой пример что можно сделать с параметрами объекта. Чаще используйте Get-Member и вы откроете для себя безграничные возможности манипуляции над объектами.
Скрипты Powershell
В самом начале статьи указал на встроенный инструмент Powershell ISE. Давайте запустим его и создадим свой первый скрипт. Кстати скрипты сохраняются в файлах с расширением ps1
Скрипт будет запускать блокнот, далее выполняется проверка если блокнот запущен выводится сообщение об этом и после блокнот закрывается. Если блокнот не запущен то выводится соответствующее сообщение об этом. На самом деле блокнот будет всегда запущен, т.к. мы вначале скрипта написали Start-Process notepad
В этом скрипте я использовал цикл if else. О циклах будет подробнее в следующей статье. Итак давайте сохраним скрипт и выполним его.
В ответ мы получим такую ошибку:
Все верно, изначально в WIndows запрещено выполнять скрипты Powershell. Это сделано для повышения безопасности системы. Для включения возможности запуска скриптов Powershell необходимо запустить Powershell от Администратора и ввести командлет Set-ExecutionPolicy с одним из параметров:
- Restricted – политика по умолчанию. Выполнение всех скриптов запрещено
- RemoteSigned – разрешено запускать собственные скрипты и подписанные доверенным разработчиком
- AllSigned – разрешено запускать скрипты, подписанные доверенным разработчиком. Каждый раз перед запуском такого скрипта PowerShell будет запрашивать подтверждение
- Unrestricted – в системе разрешается запускать любые скрипты
Если вы полностью уверены в запускаемых скриптах можете поставить Unrestricted. Давайте так и сделаем
Будет предупреждение по безопасности, соглашаемся нажав Y
Можем посмотреть текущую настройку политики безопасности при помощи командлета Get-ExecutionPolicy
В данной статье мы рассмотрели основы чтобы подготовиться писать скрипты Powershell. В следующих статьях мы более подробно изучим циклы, массивы, функции, работу со строками и много другое. Кстати вот раздел посвященный Powershell. Там много всего интересного 😉
Скрипты сервера Windows Script Host (WSH)
В статье описаны скрипты WSH (Windows Script Host), способы их запуска, состав и функциональные возможности самого сервера Windows Script Host, и несколько примеров WSH скриптов. И так, давайте приступим. Все скрипты WSH являются интерпретируемыми, то есть, для их выполнения не требуется не требуется посредника, который будет преобразовывать ваш код в машинный. Вы просто открываете блокнот и пишите код сценария WSH. По умолчанию, Windows Script Host позволяет писать сценарии на двух языках, это VBScript и Jscript, но, при желании можно установить дополнительные модули для остальных языков, например, Perl, Phyton, TCL и так далее.
Теперь давайте рассмотрим, какие типы WSH сценариев можно создавать по умолчанию и их расширения:
.vbs – данный тип файлов содержит программный код на языке VBScript, если запустить такой скрипт, то сервер Windows Script Host автоматически применит для его обработки интерпретатор VBScript.
.vbe – в данном случае, это такой же файл как и vbs, но, закодированный.
.js — данный тип файлов содержит программный код на языке JScript, сервер автоматически будет его обрабатывать интерпретатором Jscript
.jse – закодированный сценарий WSH для языка Jscript.
.wsf – данный тип файлов содержит разметку XML и позволяет объединять вместе синтаксис различным языков.
.wsc – используется для регистрации вашего скрипта как COM-компонента (скриплет). Данный тип файлов требует отдельной статьи.
.wsh – управляет скриптом, аналог файла *.pif для DOS-программ. Будет рассмотрен в данной статье более подробно.
Хорошо, давайте рассмотрим, как запускать WSH скрипты. Для этого существуют два варианта:
cscript.exe – данная программа позволяет запускать сценарии wsh в консольном режиме, то есть, в окне командной строки.
wscript.exe – запуск сценариев wsh в графическом режиме. По умолчанию, при запуске, его обрабатывает именно wscript.exe.
Для простоты эксперимента, напишем два примера, один на языке VBScript, а второй на языке Jscript:
Тут мы используем лишь один объект WScript, объявлять который не надо, он автоматически доступен. Свойство Echo отвечает за вывод информации, остальные свойства (Name, FullName …) позволяют нам получить дополнительную информацию, знак & позволяет объединять строки, символ подчеркивания говорит, что мы разделили строку, константа vbCrlf отвечает за перевод каретки.
И вот аналогичный скрипт WSH, но уже на языке Jscript:
Тут мы объявили переменную Mess, в которую прописали несколько строк, плюсик отвечает за объединение строк, а \n – за перевод строки. Для полноты понимания, советую, вам все-таки познакомиться с основами VBScript и Jscript и с остальными статьями из этой рубрики.
Хорошо, теперь стоит уточнить один момент, по умолчанию, если вы сохраните данные сценарии wsh и запустите их с помощью щелчка мыши, то их обработает программа wscipt.exe, однако есть одно но. После установки различных программ или каких-то изменений в системе, сценарии wsh будут обрабатываться совсем другой программой (блокнот, например). Просто надо отрыть свойства файла (скрипта), и изменить приложение для их обработки на wscript.exe (папка Windows\System32).
Теперь давайте рассмотрим способы запуска скриптов wsh.
Консольный режим в командной строке – просто откройте командную строку и пропишите:
cscript.exe “путь к сценарию wsh”
Кавычки нужны лишь в том случае, если путь содержит пробелы, пример:
cscript.exe D:\work\info.vbs
cscript.exe D:\work\info.js
Графический режим в командной строке – просто откройте командную строку и пропишите:
wscript.exe “путь к сценарию”
wscript.exe D:\work\info.vbs
wscript.exe D:\work\info.js
Используя меню Пуск – Откройте меню пуск, и в поле Выполнить введите путь к сценарию wsh. Например:
D:\work\info.vbs
D:\work\info.js
Хорошо, теперь настало время настройки параметров запуска
Параметры cscript.exe — если вы войдете в командную строку и пропишите cscript.exe, то вам будет показан список параметров запуска сценариев wsh. Все параметры начинаются с символов //. Встроенной справки хватит, что бы во всем разобраться. Так, параметр //Job используется при вызове заданного задания для файлов wsf, пример я привел в статье “Знакомство с ws-файлами (windows script file)”.
Параметры wscript.exe — тут все намного проще. Просто кликните по вашему wsh скрипту правой кнопкой, выберите пункт свойства и перейдите на вкладку Сценарий. Тут можно задать время, через которое произойдет остановка сценария. После того, как вы зададите значение в секундах и нажмете кнопку применить, появится файл с аналогичным названием, но с расширением wsh. Если теперь запустить этот скрипт, то произойдет выполнение сценария с заданными настройками, но, как вы уже догадались, тут есть один подводный камень. У нас сейчас два файла с одинаковыми именами (info), но с разными расширениями, для какого бы скрипты мы не применяли настройки, все ровно будет создан лишь один info.wsh. Ладно, на этом пока все, комментируйте и подписывайтесь.
Спасибо за внимание. Автор блога Владимир Баталий