Сценарий windows powershell ps1

Запись в разделе: Компьютер - Windows - Windows Power Shell. Тема: Windows PowerShell: Создание сценариев (основы)

Windows PowerShell: Курс выживания при создании сценариев

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

Если вы не привыкли к выполнению команд Windows PowerShell в консоли, потому что это кажется вам слишком сложным, пусть это и тяжело, все равно попытайтесь освоить их. Надо иметь хорошее представление о функциях безопасности Windows PowerShell. Вы должны знать о политике выполнения и о том какие параметры вы используете. Если вы еще не знаете разницу между RemoteSigned и AllSigned, а также почему одна из этих политик может быть лучше другой, скорее всего вы не готовы к чтению нижеследующего материала.

Вы также должны знать, как выполнять сценарии в оболочке, а также помнить, что при выполнении сценария всегда нужно указывать путь и имя файла. Наконец, вы должны понимать, в чем разница при выполнении в среде ISE (Integrated Scripting Environment) и в консоли. В ISE сценарии выполняются в глобальном контексте. В обычной оболочке консоли у сценариев обычно собственный контекст. Я расскажу о контексте, но вы уже должны хотя бы примерно понимать, что он означает и что делает.

Если вам кажется, что вы недостаточно подготовлены, могу посоветовать почитать мою книгу «Learn Windows PowerShell in a Month of Lunches» (Manning Publications, 2011) и веб-сайт по теме, — возможно эти ресурсы помогут вам усвоить больше базовой информации.

Можете пользоваться этими ресурсами в процессе чтения статьи. Попытайтесь выполнить примеры. Если ввести (или скопировать) примеры сценариев в среду Windows PowerShell ISE, начиная со строки, тогда номера строк будут совпадать с номерами строк в описаниях.

Файлы сценариев Windows PowerShell

Файл сценария Windows PowerShell представляет собой простой текстовый файл с расширением .PS1. Единица указывает на версию не Windows PowerShell, а скорее версию обработчика языка. В Windows PowerShell версий 1 и 2 используется обработчик языка версии 1. Поэтому обе версии оболочки устанавливаются в подпапку v1.0 папки WindowsSystem32WindowsPowerShell.

Сценарий Windows PowerShell не совсем похож на командный файл для командной строки, кроме того выполнение сценария не совсем то же самое, что вводить вручную те же команды в той же последовательности. Например, откройте окно консоли и выполните следующее, нажимая Enter после каждой строки:

  1. Get-Service
  2. Get-Process

А теперь введите точно такие же команды в файл сценария или в панель редактирования сценариев в ISE и выполните сценарий. Результаты будут отличаться. При каждом нажатии Enter в Windows PowerShell вы запускаете новый конвейер. Все вводимые вами команды выполняются в одном конвейере. В конце существования конвейера Windows PowerShell преобразует его содержимое в текст на экране. При выполнении этих двух команд в обычной консоли это происходит в двух разных конвейерах.

Windows PowerShell смогла создать уникальные результаты работы для каждого набора выходных данных. С другой стороны, при запуске в составе сценария обе команды выполняются в одном конвейере. Система форматирования Windows PowerShell не настолько изощренна, чтобы создавать отдельные наборы выходных данных для двух результатов. Попытайтесь выполнить это в консоли:

  1. Get-Service;Get-Process

Результаты будут такими же, как и при выполнении сценария с этими двумя командами. В данном случае обе команды выполняются в одном конвейере. Именно это происходит при выполнении сценария.

Практический вывод из всего может заключаться в том, что сценарий должен возвращать выходные данные только одного вида. Это плохая идея по причине ограничений системы форматирования. Есть также другие соображения. Не нужно, чтобы сценарий одновременно сбрасывал в конвейер разнородные данные.

Надо помнить об этом правиле на протяжении всего времени чтения этой статьи. Сценарий должен создавать один и только один тип выходных данных. Единственное исключение — когда сценарий используется как репозиторий нескольких функций. В этом случае каждая функция должна генерировать один и только один тип выходных данных.

Переменные

Переменные следует считать чем-то вроде ящика, в который можно положить одну или несколько вещей, даже разнородных. У ящика есть имя, и в Windows PowerShell это имя может содержать практически любые символы. Именем переменной может быть как «Var», так и «{my variable}». Во втором примере имя переменной заключено в фигурные скобки, потому что оно содержит пробелы; выглядит это не очень красиво. Рекомендую все-таки использовать в именах переменных только буквы, цифры и подчеркивания.

При использовании имени переменной ссылаются на сам «ящик». Если нужно сослаться на содержимое ящика, используйте знак доллара, например, так: $var. В Windows PowerShell вам часто будут встречаться переменные со знаком доллара, так как весь смысл в его использовании заключается в получении содержимого переменных. Вместе с тем, надо помнить, что знак доллара не является частью имени переменной. Это всего лишь подсказка для Windows PowerShell, что вам требуется содержимое, а не сам ящик. Вот несколько примеров:

  1. $var = ‘hello’
  2. $number = 1
  3. $numbers = 1,2,3,4,5,6,7,8,9

В примерах показано, как назначать переменным значения с использованием оператора присвоения (=). В последнем примере создается массив, потому что Windows PowerShell интерпертирует разделенные запятыми списки как массивы, или наборы элементов. В первом примере присваивается объект, представляющий собой строку, а вся строка заключается в кавычки.

Есть одна особенность Windows PowerShell, которая может вводить в заблуждение новичков. Windows PowerShell не «понимает», какой смысл связывается с именем переменной. Имя $computername не «говорит» оболочке, что в переменной хранится имя компьютера.

Аналогично имя $numbers не говорит оболочке, что переменная будет содержать более одного числа. Оболочке также все равно, какое число вы используете, — единственное или множественное. Для оболочки следующее выражение:

  1. $numbers = 1

…правильное и ничем не отличается от такого:

  1. $numbers = ‘fred.’

Вместе с тем, если переменная содержит несколько значений, для получения одного из них можно задействовать специальный синтаксис. Чтобы получить первый элемент, нужно использовать выражение $numbers[0], второй — $numbers[1], а последний элемент изображается так: $numbers[-1], предпоследний — $numbers[-2] и так далее.

Кавычки

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

Во-первых, это делают, когда нужно вставить содержимое переменной в строку. Только при наличии двойных кавычек Windows PowerShell будет искать знак «$» и предполагать, что все, что следует после этого знака и до первого символа, который не может быть частью имени переменной, является именем переменной. Вместо знака доллара с именем переменной будет вставлено ее содержимое.

  1. $name = ‘Don’
  2. $prompt = «My name is $name»

Переменная $prompt содержит строку «My name is Don», потому что $name заменяется содержимым этой переменной. Это замечательный прием — соединение строк вместо их конкатенации.

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

  1. $debug = «`$computer contains $computer»
  2. $head = «Column`tColumn`tColumn»

В первом примере первый знак доллара $ отменяется. Обратная кавычка отменяет его значение как аксессора переменной. Если переменная $computer содержит строку «SERVER», тогда в $debug будет содержаться такая строка: «$computer contains SERVER».

Во втором примере «`t» представляет собой символ табуляции, поэтому Windows PowerShell разместит между словами Column знаки табуляции. Подробнее об управляющих символах см. веб-страницу.

Наконец, двойные кавычки используются, когда строка должна содержать одинарные кавычки:

  1. $filter1 = «name=’BITS'»
  2. $computer = ‘BITS’
  3. $filter2 = «name=’$computer'»

В этом примере создается строка «name=’BITS’». Все необходимое заключается в двойные кавычки. В $filter1 и $filter2 содержится одно и то же, но в $filter2 значение задается с использованием уловкой с заменой переменной в двойных кавычках. Заметьте, что значение имеет только самая «внешняя» пара кавычек. Одинарные кавычки оболочку Windows PowerShell не интересуют. Эти одинарные кавычки представляют собой простые литеральные символы. Windows PowerShell их не интерпретирует.

Члены и переменные объектов

В Windows PowerShell все состоит из объектов. Даже простая строка, такая как «name», является объектом типа System.String. Чтобы узнать тип объекта (то есть, что представляет собой объект), а также его членов, к которым относятся его свойства и методы, достаточно передать объект в Get-Member по конвейеру:

  1. $var = ‘Hello’
  2. $var | Get-Member

Используйте точку после имени переменной, чтобы сказать оболочке: «Мне не нужен доступ ко всему объекту в переменной, а только к одному из его свойств или методов». После точки укажите нужное свойство или имя метода.

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

  1. $svc = Get-Service
  2. $svc[0].name
  3. $name = $svc[1].name
  4. $name.length
  5. $name.ToUpper()

Обратите внимание на вторую строчку. Она начинается с обращения к первому элементу переменной $svc. Точка означает, что нам не нужен весь объект, а только его свойство или метод. В данном случае нужно свойство name. В пятой строке показано, как обращаться к методу, указывая его имя после точки, а также пару скобок.

Обычно точка в именах переменных не используется, так как она отделяет свойство или метод.  Это означает, что вторая строка в следующем примере будет делать не то, что ожидалось:

  1. $service = ‘bits’
  2. $name = «Service is $service.ToUpper()»
  3. $upper = $name.ToUpper()
  4. $name = «Service is $upper»

На второй строке $name содержит«Service is BITS.ToUpper()», а в четвертой строке — «Service is BITS».

Скобки

Помимо указания на методы объектов, скобки также служат в Windows PowerShell маркерами, определяющими порядок выполнения, — как в обычных алгебраических выражениях. Иначе говоря, скобки указывают оболочке, что нужно выполнять в первую очередь. Выражение в скобках заменяется тем, что получается в результате вычисления этого выражения. Вот несколько задачек на сообразительность:

  1. $name = (Get-Service)[0].name
  2. Get-Service -computerName (Get-Content names.txt)

В первой строке $name содержит имя первой службы в системе. Чтобы понять этот пример, придется немного напрячь мозги. Начнем с выражения в скобках. Windows PowerShell начнет анализ именно с этого места. Get-Service разрешается в набор, или массив, служб. Выражение [0] позволяет получить первый элемент массива, которым будет первая служба. Так как за этим следует точка, мы знаем, что идет обращение к свойству или методу этой службы, а не ко всему объекту. Наконец мы извлекаем только имя службы.

Во второй строке выражение в скобках читает содержимое текстового файла. Если файл содержит имена компьютеров — по одному в строке, Get-Content вернет массив имен компьютеров. Они передаются в параметр –computerName командлета Get-Service. В данном случае оболочка передаст результат любого выражения в скобках, возвращающего массив строк, в параметр –computerName, потому что последний создан принимать массивы строк.

Область действия

Область действия — это понятие в программировании, служащее в качестве системы «контейнеризации». Такие вещи как переменные, псевдонимы, диски и другие элементы Windows PowerShell, все хранятся в области действия. Оболочка поддерживает иерархию областей действия и определяет ряд правил, определяющих порядок взаимодействия и обмена информацией между областями действия.

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

По окончании работы сценария его область действия отбрасывается, а все созданное в ней исчезает. Например, создайте следующий сценарий и выполните его в окне консоли:

  1. New-PSDrive -PSProviderFileSystem -Root C: -Name Sys
  2. Dir SYS:

После выполнения сценария вручную выполните команду Dir SYS:. Вы получите ошибку. Причина в том, что диск SYS: был создан в сценарии. По окончании работы сценария все им созданное было уничтожено. Диск SYS: больше не существует. Не все в оболочке работает в собственном диапазоне. Такие элементы, как модули всегда обрабатываются глобально. Модуль, загруженный сценарием, остается таковым по окончании работы сценария.

Если в области действия предпринимается попытка обратиться к чему-то, что не было создано в ней, Windows PowerShell обращается к следующей области действия более высокого уровня («родительской»). Вот почему псевдоним Dir сработал в созданном вами сценарии. Хотя Dir не существовал в области действия сценария, он существовал в области действия более высокого уровня — в глобальной области действия. В области действия можно создавать элементы с именами, которые существуют в области более высокого уровня. Вот еще один сценарий для выполнения:

  1. Dir
  2. New-Alias Dir Get-Alias
  3. Dir

Это кажется странным, но при первом выполнении Dir каталог не существовал в области действия сценария. Был использован псевдоним Dir более высокого уровня. Этот псевдоним указывает на Get-ChildItem, поэтому было показано знакомое содержимое каталога.

Затем сценарий создал новый псевдоним по имени Dir, который уже указывает на Get-Alias. Именно эта команда выполнялась во втором случае. Все это никак не повлияло на псевдоним Dir верхнего уровня. Попытайтесь выполнить Dir в оболочке после запуска предыдущего сценария и вы снова получите список содержимого каталога.

В областях действия особенно легко запутаться, когда речь идет о переменных. Как правило, из определенной области действия никогда не следует обращаться к элементам за ее пределами, особенно к переменным. Есть синтаксис для выполнения таких операций, например можно использовать $global:var для принудительного обращения к переменной $var глобальной области действия, но это очень плохой способ, применение которого допустимо только в очень специфических обстоятельствах.

Язык сценариев Windows PowerShell

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

Несмотря на свою простоту, язык Windows PowerShell более чем эффективен для своих задач. Сейчас я расскажу об основных сценарных конструкциях, но вы всегда можете получить более подробные сведения, обратившись к соответствующей about-статье в оболочке. Например, help about_switch содержит информацию о конструкции Switch, а help about_if —о конструкции If. Чтобы получить список всех about-статей, выполните команду help about*.

Конструкция If

Это основная конструкция Windows PowerShell для принятия решений. Полная ее форма выглядит так:

  1. If ($this -eq $that) {
  2.   # commands
  3. } elseif ($those -ne $them) {
  4.   # commands
  5. } elseif ($we -gt $they) {
  6.   # commands
  7. } else {
  8.   # commands
  9. }

Ключевое слово «If» является обязательной частью конструкции. Результат вычисления следующего за ним выражения должен быть True или False. Windows PowerShell всегда интерпретирует ноль как False, а любое ненулевое значение как True.

Windows PowerShell также различает встроенные переменные $True и $False, которые представляют указанные булевы значения. Если выражение в скобках равно True, тогда выполняются команды в следующих далее фигурных скобках. Если выражение равно False, эти команды не выполняются. Это минимально необходимый состав конструкции If.

Можно пойти чуть дальше, задав один или больше разделов ElseIf. Они работают так же, как и конструкция If. У них есть собственное выражение в скобках. Если оно равно True, выполняются команды в следующих за выражением фигурных скобках. В противном случае команды не выполняются.

Завершить конструкцию можно блоком Else, который выполняется, если не выполнился ни один из предыдущих блоков команд.  Выполнится только первый блок команд, для которого выражение в скобках равно True. Например, если $this не равно $that, а $those не равно $them, тогда будут выполнены только команды в четвертой строке. Windows PowerShell даже не станет вычислять выражение для elseif в пятой строке.

Символ «решетка» (#) служит для выделения комментариев, то есть Windows PowerShell игнорирует весь текст от этого символа до следующего возврата каретки. Также обратите внимание на аккуратное форматирование описанных конструкций. Некоторые форматируют текст так:

  1. if ($those -eq $these)
  2. {
  3.   #commands
  4. }

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

В среде Windows PowerShell ISE для этой цели можно использовать клавишу Tab, при нажатии которой по умолчанию делается отступ размеров в четыре пробела. Отступы в коде — это базовое требование к написанию кода. Если этого не делать, в объемных сценариях будет очень сложно не ошибиться при расстановке фигурных скобок. Ну и не стоить говорить, что даже новички Windows PowerShell будут насмехаться над вашим текстом без отступов. Посмотрите на этот плохо форматированный сценарий:

  1. function mine {
  2. if ($this -eq $that){
  3. get-service
  4. }}

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

  1. function mine {
  2.  if ($this -eq $that){
  3.   get-service
  4.  }
  5. }

Оболочка не требует, чтобы закрывающие фигурные скобки размещались на отдельных строках, но для восприятия человеком такой формат намного удобнее. Аккуратно соблюдая форматирование, вы избавитесь от многих проблем при работе со сценариями.

Конструкция Do While

Это конструкция цикла в Windows PowerShell. Она служит для многократного выполнения блока команд, пока условие равно True или не станет True. Вот самый простой случай:

  1. Do {
  2.   # commands
  3. } While ($this -eq $that)

В этом варианте конструкции команды в фигурных скобках выполнятся по крайней мере один раз. Условие While вычисляется не ранее, чем первый раз выполнится блок команд. Можно перенести While — тогда команды будут выполнены, только если с самого начала условие равно True:

  1. While (Test-Path $path) {
  2.   # commands
  3. }

Заметьте, что во втором примере не используется оператор сравнения, например -eq. Причина в том, что командлет Test-Path по определению возвращает True или False, поэтому для нормальной работы выражения эти значения не нужно ни с чем сравнивать.

Выражение в скобках в этой конструкции вырождается до простого значения True или False. Именно это происходит, когда вы используете команду, которая всегда возвращает True или False, например Test-Path. Как всегда, есть соответствующая about-статья, где можно найти другие примеры использования этой конструкции.

Конструкция ForEach

Работа этой конструкции похожа на поведение командлета ForEach-Object. Различия только в синтаксисе. Задача ForEach — принять массив (или набор, что в Windows PowerShell равносильно массиву) и выполнить его перечисление, чтобы можно было каждый раз работать с одним объектом:

  1. $services = Get-Service
  2. ForEach ($service in $services) {
  3.   $service.Stop()
  4. }

Новички могут очень легко запутаться с этой конструкцией. Помните, что множественное число слова «services» в английском для Windows PowerShell ничего не значит. Переменная называется именно так, чтобы напоминать, что содержит одни или несколько служб. Если это множественное число, то это не значит, что оболочка будет как-то особо его обрабатывать.

Ключевое слово «in» во второй строке является частью синтаксиса ForEach. Имя $service — это просто произвольное имя переменной. С таким же успехом в этом месте могло быть им $fred или $coffee.

Windows PowerShell будет повторно выполнять команды в фигурных скобках по отношению к каждому очередному объекту во второй переменной ($services). Каждый раз оболочка будет принимать один объект из второй переменной ($services) и помещать его в первую переменную ($service).

В конструкции первую переменную ($service) нужно использовать как содержащую единичный объект. В третьей строке точка означает, что нужен не весь объект, а только один из его членов — метод Stop.

Иногда бывает так, что использование ForEach желательно и даже неизбежно. Однако если у вас уже есть опыт программирования, вы можете прибегать к ForEach, когда этого лучше не делать. В предыдущем примере лучше не использовать ForEach. Разве не проще сделать так:

  1. Get-Service | Stop-Service

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

  • Когда нужно выполнить метод по отношению к набору объектов и нет командлета, который бы мог выполнить эту задачу.
  • Если есть набор объектов и по отношению к каждому нужно выполнить ряд последовательных операций.
  • Когда операцию нужно выполнять только по отношению к одному объекту за раз, но в процессе выполнения сценария количество объектов — один или несколько — заранее неизвестно.

Другие конструкции

В Windows PowerShell есть ряд других конструкций, в том числе Switch, For и другие. Они описаны в about-статьях оболочки. Иногда их можно заменять уже описанными конструкциями. Например, можно заменить Switch конструкцией If с несколькими разделами ElseIf. For можно заменить ForEach или даже командлетом ForEach-Object. Вот пример цикла, который выполняется ровно десять раз:

  1. 1..10 | ForEach-Object -process {
  2.   # code here will repeat 10 times
  3.   # use $_ to access the current iteration
  4.   # number
  5. }

Вы сами должны решать, какая конструкция лучше подойдет в той или иной ситуации. Если будете искать сценарии в Интернете, будьте готовы к любым вариантам.

Функции

Функция — это особый вид конструкции, служащий для объединения группы взаимосвязанных команд для выполнения одной четко определенной задачи. Вообще говоря, можно взять любой сценарий Windows PowerShell и «обернуть» его в функцию:

  1. function Mine {
  2.   Get-Service
  3.   Get-Process
  4. }
  5. Mine

Здесь определена новая функция по имени Mine. Это, в сущности, превращает Mine в команду, так как запустить функцию можно, просто указав ее имя. Именно это и происходит в пятой строке.

Функции обычно располагают в файлах сценариев. Один сценарий может содержать несколько функций. А функции могут содержать в себе другие функции.

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

  1. function One {
  2.   function Two {
  3. Dir
  4.   }
  5.   Two
  6. }
  7. One
  8. Two

Представьте, что вы разместили этот текст в файле сценария и выполнили его. В седьмой строке выполняется функция One, определение которой начинается на первой строке. В пятой строке выполняется функция Two, определение которой начинается на пятой строке. Поэтому в результате получим список содержимого каталога — соответствующая команда размещена на третьей строке в функции Two.

Но следующая выполняемая строка (номер восемь) приведет к ошибке. В сценарии нет функции по имени Two. Функция Two спрятана в функции One. Поэтому функция Two существует только в области действия функции One и видна только из последней. Попытка вызвать Two из любого другого места приведет к ошибке.

Параметры в сценарии

Редко сценарии создаются для выполнения в точности одной и той же задачи при каждом запуске. Чаще сценарии содержат изменяемые данные или их поведение может меняться в зависимости от входных данных. Эти вариации можно реализовать с помощью параметров.

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

  1. param (
  2.   [string]$computername,
  3.   [string]$logfile,
  4.   [int]$attemptcount = 5
  5. )

Здесь определяются три параметра. В сценарии они используются как любые другие переменные. Вы наверняка заметили, что в пятой строке я присвоил параметру $attemptcount значение по умолчанию. Это значение будет заменено значением входного параметра, но если он не будет задан, сценарий будет выполняться со значением по умолчанию.

Вот несколько способов запуска сценария (предполагается, что сценарий содержится в файле Test.ps1):

  1. ./test -computername SERVER
  2. ./test -comp SERVER -log err.txt -attempt 2
  3. ./test SERVER err.txt 2
  4. ./test SERVER 2
  5. ./test -log err.txt -attempt 2 -comp SERVER

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

  • В первой строке я задал только один из параметров, поэтому $logfile будет пустым, а $attemptcount будет содержать 5, значение по умолчанию.
  • Во второй строке я задал все три параметра, но при этом использовал сокращенные имена. Как и в командлетах, достаточно задать только начало имени параметра, которого достаточно для того, чтобы оболочка Windows PowerShell «поняла», о чем идет речь.
  • В третьей строке снова заданы все три параметра, но теперь они заданы по позициям, без использования имен параметров. Насколько я помню, если параметры задавать точно в том порядке, в каком они определены в сценарии, все работает нормально.
  • В четвертой строке показано, что происходит, если не соблюдать осторожность. Здесь $computername получит значение «SERVER», $logfile будет содержать 2, а $attemptcount — 5. Это не совсем то, что мне было нужно. Если не использовать имена параметров, теряется гибкость. Также посторонним людям становится сложнее понять, что вы имели в виду, а это в свою очередь усложняет устранение возможных неполадок.
  • В пятой строке приведен лучший пример. Здесь я указал параметры не в том порядке, в котором они определены, но это не страшно, потому что я указал их имена. В общем случае рекомендуется использовать имена параметров — это дает дополнительную гибкость. Вам не нужно будет помнить порядок, в котором они определены.

Более сложные сценарии

Windows PowerShell предоставляет возможность предоставлять дополнительную информацию о параметрах. Можно определить параметр как обязательный, принимающий входные данные из конвейера и т. п. Этот прием называется привязкой командлетов.

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

  1. [CmdletBinding()]
  2. param (
  3.   [Parameter(Mandatory=$True)]
  4.   [string]$computername,
  5.   [Parameter(Mandatory=$True)]
  6.   [string]$logfile,
  7.   [int]$attemptcount = 5
  8. )

Я добавил всего лишь инструкцию [CmdletBinding()] в первой исполняемой строке кода в сценарии. Перед этой строкой не разрешается ничего размещать кроме комментариев. Я также присоединил к своим двум параметрам инструкцию [Parameter()], где указал, что они обязательны. Теперь если кто-то попытается выполнить сценарий, не задав эти параметры, Windows PowerShell предложит ввести эту информацию.

Обратите внимание, что у последнего параметра нет никаких дополнительных инструкций, а все три параметра представляют собой разделенный запятыми список (то есть после первых двух параметров стоят запятые). ). Есть масса другой информации, которую можно задать для параметра и которая доступна в статье.

Это было очень быстрое введение по теме создания сценариев в Windows PowerShell. Я надеюсь, что из этой статьи вы почерпнули что-то полезное. Создание параметризованных сценариев — особенно полезная функциональность, потому что позволяет создавать сценарии, которые выглядят и ведут себя так же, как и настоящие командлеты Windows PowerShell.

В Windows 10 PowerShell — это инструмент, предназначенный для запуска команд и сценариев для изменения настроек, автоматизации задач и других действий. В некотором смысле это похоже на командную строку. Однако PowerShell — это более функциональный интерфейс командной строки (CLI), который предлагает более обширный набор инструментов, а также большую гибкость и контроль. Кроме того, в отличие от командной строки, PowerShell доступен на разных платформах, включая Windows, macOS и Linux.

Сценарий — это набор инструкций, сохраненных в текстовом файле (со специальным расширением «.ps1»), которые PowerShell понимает и последовательно выполняет для выполнения различных действий.

Единственное предостережение заключается в том, что протокол безопасности по умолчанию всегда блокирует запуск скриптов на вашем компьютере. Это означает, что при двойном щелчке по файлу «.ps1» в Windows 10 ничего не произойдет, и если вы попытаетесь запустить скрипт в PowerShell, вы увидите «невозможно загрузить, потому что запуск скриптов отключен в этой системе». сообщение об ошибке. Однако запуск скриптов на ноутбуке или настольном компьютере невозможен. Вам нужно только включить правильную политику выполнения.

В этом руководстве по Windows 10 мы покажем вам, как успешно написать и запустить ваш первый файл сценария в PowerShell с помощью Visual Studio Code, Блокнота и консоли интегрированной среды сценариев PowerShell (ISE).

Вы можете создавать файлы сценариев PowerShell, используя практически любой текстовый редактор или устаревшую консоль ISE. Однако предпочтительным вариантом (спасибо, @JotaKa, за совет) для написания скриптов является использование редактора кода Visual Studio с расширением PowerShell.

Создайте скрипт с помощью Visual Studio Code

Visual Studio Code (VS Code) — это бесплатный и расширяемый кроссплатформенный редактор кода, позволяющий редактировать практически любой язык программирования. А при добавлении расширения PowerShell вы получаете возможность интерактивного редактирования сценариев даже с поддержкой IntelliSense (дополнение кода).

Приложение PowerShell ISE по-прежнему будет доступно, но Visual Studio Code с расширением PowerShell станет новым интерфейсом по умолчанию. Кроме того, учтите, что устаревший опыт не получит никаких новых функций и не поддерживает выпуски PowerShell 7 или более поздних версий.

Установите код Visual Studio

Чтобы установить Visual Basic Code в Windows 10, выполните следующие действия:

  1. Открыть страницу загрузки Visual Studio.
  2. Нажмите кнопку Windows, чтобы загрузить программу установки.

    Загрузка кода Visual Studio

  3. Дважды щелкните программу установки, чтобы начать процесс установки.
  4. Подтвердите условия соглашения.
  5. Нажмите кнопку «Далее».

    Настройка VS-кода

  6. Нажмите кнопку Далее еще раз.
  7. Нажмите кнопку Далее еще раз.
  8. При необходимости подтвердите дополнительные задачи.

    Дополнительные настройки кода Visual Studio

  9. Нажмите кнопку «Далее».
  10. Нажмите кнопку Установить.
  11. Нажмите кнопку Готово.

Выполнив эти шаги, вы можете продолжить установку расширения PowerShell.

Установите расширение PowerShell

Чтобы установить расширение PowerShell в VS Code, выполните следующие действия:

  1. Откройте код VS.
  2. Перейдите на вкладку «Расширения» (Ctrl + Shift + X) на левой панели.
  3. Найдите PowerShell и выберите лучший результат.
  4. Нажмите кнопку Установить.

    VS Code устанавливает PowerShell

  5. Нажмите кнопку «Доверять рабочей области и установить».

После выполнения этих шагов вы можете приступить к написанию сценариев PowerShell с помощью Visual Studio Code в Windows 10.

Создайте сценарий PowerShell с помощью кода Visual Studio.

Чтобы создать сценарий с помощью кода Visual Basic, выполните следующие действия.

  1. Откройте код VS.
  2. Щелкните меню «Файл» и выберите параметр «Новый файл».
  3. Щелкните меню «Файл» и выберите параметр «Сохранить как».

    VS Code создает новый файл ps1

  4. В поле «Имя файла» укажите имя файла с расширением .ps1 — например: first_script.ps1.
  5. Нажмите кнопку Сохранить.
  6. Напишите новый или вставьте скрипт, который хотите запустить, например:

    Write-Host «Поздравляем! Ваш первый скрипт успешно выполнен»

    Краткое примечание: приведенный выше скрипт выведет на экран фразу «Поздравляем! Ваш первый скрипт успешно выполнен».

  7. (Необязательно) Нажмите кнопку «Выполнить» в правом верхнем углу (или нажмите клавишу F5), чтобы запустить скрипт.

    Запустите скрипт PowerShell в коде Visual Studio.

  8. Щелкните меню «Файл».
  9. Нажмите «Сохранить».

Создайте сценарий PowerShell с помощью Блокнота

Чтобы создать сценарий PowerShell с помощью редактора «Блокнот» в Windows 10, выполните следующие действия:

  1. Откройте Пуск.
  2. Найдите Блокнот и щелкните верхний результат, чтобы открыть приложение.
  3. Напишите новый или вставьте свой скрипт в текстовый файл — например:

    Write-Host «Поздравляем! Ваш первый скрипт успешно выполнен»

    Скрипт блокнота PowerShell

  4. Щелкните меню «Файл».
  5. Выберите параметр «Сохранить как».
  6. Подтвердите описательное имя сценария, например, first_script.ps1.

    Файл сценария Notepad ps1 Powershell

  7. Нажмите кнопку Сохранить.

Создание сценария PowerShell с интегрированной средой сценариев

Кроме того, вы можете использовать встроенную консоль PowerShell ISE для кодирования сценариев в Windows 10.

Интегрированная среда сценариев — это расширенный инструмент, но вы можете начать работу, выполнив следующие действия:

  1. Откройте Пуск.
  2. Найдите Windows PowerShell ISE, щелкните правой кнопкой мыши верхний результат и выберите параметр «Запуск от имени администратора».
  3. Щелкните меню «Файл».
  4. Выберите параметр «Создать», чтобы создать новый пустой файл .ps1.

    PowerShell создает файл PS1 с помощью ISE

  5. Напишите новый или вставьте скрипт, который хотите запустить, например:

    Write-Host «Поздравляем! Ваш первый скрипт успешно выполнен»

    Скрипт PowerShell ISE

  6. Щелкните меню «Файл».
  7. Нажмите «Сохранить».
  8. Введите имя сценария, например, first_script.ps1.

    Сценарий PowerShell ISE Ps1 Сохранить

  9. Выберите папку для хранения файла сценария.
  10. Нажмите кнопку Сохранить.
  11. (Необязательно) Нажмите кнопку «Выполнить» в правом верхнем углу (или нажмите клавишу F5), чтобы запустить скрипт.

После выполнения этих шагов с помощью Блокнота, Visual Studio Code или PowerShell ISE сценарий будет готов к запуску, но с системными настройками по умолчанию произойдет сбой. Причина в том, что параметры PowerShell по умолчанию настроены на блокировку выполнения любого скрипта. (Единственным исключением является запуск содержимого скрипта в Visual Studio Code или PowerShell ISE.)

Как запустить файл сценария PowerShell в Windows 10

В Windows 10 для запуска файла сценария с помощью консоли PowerShell необходимо изменить политику выполнения.

Чтобы изменить политику выполнения для запуска сценариев PowerShell в Windows 10, выполните следующие действия:

  1. Откройте Пуск.
  2. Найдите PowerShell, щелкните правой кнопкой мыши верхний результат и выберите параметр «Запуск от имени администратора».
  3. Введите следующую команду, чтобы разрешить запуск скриптов, и нажмите Enter:

    Set-ExecutionPolicy RemoteSigned

  4. Введите A и нажмите Enter (если применимо).
  5. Введите следующую команду для запуска скрипта и нажмите Enter:

    & «C:PATHTOSCRIPTfirst_script.ps1»

    В приведенной выше команде измените «PATHTOSCRIPT» на расположение вашего скрипта.

    Например, эта команда запускает скрипт, хранящийся в папке «Загрузки»:

    & «C:Пользователиимя пользователяЗагрузкиfirst_script.ps1»

    Запустите скрипт PowerShell в Windows 10

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

В Windows 10 PowerShell включает четыре политики выполнения:

  • Restricted — останавливает запуск любого скрипта.
  • RemoteSigned — разрешает сценарии, созданные на устройстве, но сценарии, созданные на другом компьютере, не будут выполняться, если они не содержат подпись доверенного издателя.
  • AllSigned — будут выполняться все сценарии, но только в том случае, если их подписал доверенный издатель.
  • Unrestricted — Запускает любой скрипт без каких-либо ограничений.

Вы должны разрешать локальные сценарии только тогда, когда вам нужно запустить сценарий из надежного источника. Если вы не планируете запускать сценарии регулярно, рекомендуется восстановить настройки по умолчанию, чтобы заблокировать ненадежные сценарии, используя те же инструкции, описанные выше, но на шаге 4 используйте команду Set-ExecutionPolicy Restricted.

Дополнительные ресурсы Windows

Для получения дополнительных полезных статей, обзоров и ответов на распространенные вопросы о Windows 10 и Windows 11 посетите следующие ресурсы:

Windows 11 с поддержкой двух экранов теперь работает на Surface Duo

Становимся ближе

Windows 11 с поддержкой двух экранов теперь работает на Surface Duo

Совершив значительный прорыв, разработчик Гюстав Монс сумел заставить оба экрана работать в Windows 11 на оригинальном Surface Duo. Хотя сенсорные экраны в настоящее время не работают, они, вероятно, будут решены в ближайшие недели. Вот все, что нового появилось в этом забавном проекте GitHub.

description ms.date title

This article describes how to create, edit, run, and save scripts in the Script Pane.

10/07/2021

How to Write and Run Scripts in the Windows PowerShell ISE

How to Write and Run Scripts in the Windows PowerShell ISE

This article describes how to create, edit, run, and save scripts in the Script Pane.

How to create and run scripts

You can open and edit Windows PowerShell files in the Script Pane. Specific file types of interest
in Windows PowerShell are script files (.ps1), script data files (.psd1), and script module
files (.psm1). These file types are syntax colored in the Script Pane editor. Other common file
types you may open in the Script Pane are configuration files (.ps1xml), XML files, and text
files.

[!NOTE]
The Windows PowerShell execution policy determines whether you can run scripts and load Windows
PowerShell profiles and configuration files. The default execution policy, Restricted, prevents
all scripts from running, and prevents loading profiles. To change the execution policy to allow
profiles to load and be used, see
Set-ExecutionPolicy and
about_Signing.

To create a new script file

On the toolbar, click New, or on the File menu, click New. The created file appears in
a new file tab under the current PowerShell tab. Remember that the PowerShell tabs are only visible
when there are more than one. By default a file of type script (.ps1) is created, but it can be
saved with a new name and extension. Multiple script files can be created in the same PowerShell
tab.

To open an existing script

On the toolbar, click Open, or on the File menu, click Open. In the Open dialog
box, select the file you want to open. The opened file appears in a new tab.

To close a script tab

Click the Close icon (X) of the file tab you want to close or select the File menu and
click Close.

If the file has been altered since it was last saved, you’re prompted to save or discard it.

To display the file path

On the file tab, point to the file name. The fully qualified path to the script file appears in a
tooltip.

To run a script

On the toolbar, click Run Script, or on the File menu, click Run.

To run a portion of a script

  1. In the Script Pane, select a portion of a script.
  2. On the File menu, click Run Selection, or on the toolbar, click Run Selection.

To stop a running script

There are several ways to stop a running script.

  • Click Stop Operation on the toolbar
  • Press CTRL+BREAK
  • Select the File menu and click Stop Operation.

Pressing CTRL+C also works unless some text is currently selected, in which
case CTRL+C maps to the copy function for the selected text.

How to write and edit text in the Script Pane

You can copy, cut, paste, find, and replace text in the Script Pane. You can also undo and redo the
last action you just performed. The keyboard shortcuts for these actions are the same shortcuts
used for all Windows applications.

To enter text in the Script Pane

  1. Move the cursor to the Script Pane by clicking anywhere in the Script Pane, or by clicking Go
    to Script Pane
    in the View menu.
  2. Create a script. Syntax coloring and tab completion provide a richer editing experience in
    Windows PowerShell ISE.
  3. See How to Use Tab Completion in the Script Pane and Console Pane
    for details about using the tab completion feature to help in typing.

To find text in the Script Pane

  1. To find text anywhere, press CTRL+F or, on the Edit menu, click Find
    in Script
    .
  2. To find text after the cursor, press F3 or, on the Edit menu, click Find Next in
    Script
    .
  3. To find text before the cursor, press SHIFT+F3 or, on the Edit menu,
    click Find Previous in Script.

To find and replace text in the Script Pane

Press CTRL+H or, on the Edit menu, click Replace in Script. Enter the
text you want to find and the replacement text, then press ENTER.

To go to a particular line of text in the Script Pane

  1. In the Script Pane, press CTRL+G or, on the Edit menu, click Go to
    Line
    .

  2. Enter a line number.

To copy text in the Script Pane

  1. In the Script Pane, select the text that you want to copy.

  2. Press CTRL+C or, on the toolbar, click the Copy icon, or on the
    Edit menu, click Copy.

To cut text in the Script Pane

  1. In the Script Pane, select the text that you want to cut.
  2. Press CTRL+X or, on the toolbar, click the Cut icon, or on the Edit
    menu, click Cut.

To paste text into the Script Pane

Press CTRL+V or, on the toolbar, click the Paste icon, or on the Edit
menu, click Paste.

To undo an action in the Script Pane

Press CTRL+Z or, on the toolbar, click the Undo icon, or on the Edit
menu, click Undo.

To redo an action in the Script Pane

Press CTRL+Y or, on the toolbar, click the Redo icon, or on the Edit
menu, click Redo.

How to save a script

An asterisk appears next to the script name to mark a file that hasn’t been saved since it was
changed. The asterisk disappears when the file is saved.

To save a script

Press CTRL+S or, on the toolbar, click the Save icon, or on the File
menu, click Save.

To save and name a script

  1. On the File menu, click Save As. The Save As dialog box will appear.
  2. In the File name box, enter a name for the file.
  3. In the Save as type box, select a file type. For example, in the Save as type box,
    select ‘PowerShell Scripts (*.ps1)’.
  4. Click Save.

To save a script in ASCII encoding

By default, Windows PowerShell ISE saves new script files (.ps1), script data files (.psd1), and
script module files (.psm1) as Unicode (BigEndianUnicode). To save a script in another
encoding, such as ASCII (ANSI), use the Save or SaveAs methods on the
$psISE.CurrentFile object.

The following command saves a new script as MyScript.ps1 with ASCII encoding.

$psISE.CurrentFile.SaveAs("MyScript.ps1", [System.Text.Encoding]::ASCII)

The following command replaces the current script file with a file with the same name, but with
ASCII encoding.

$psISE.CurrentFile.Save([System.Text.Encoding]::ASCII)

The following command gets the encoding of the current file.

$psISE.CurrentFile.encoding

Windows PowerShell ISE supports the following encoding options: ASCII, BigEndianUnicode, Unicode,
UTF32, UTF7, UTF8, and Default. The value of the Default option varies with the system.

Windows PowerShell ISE doesn’t change the encoding of script files when you use the Save or
Save As commands.

See Also

  • Exploring the Windows PowerShell ISE
description ms.date title

This article describes how to create, edit, run, and save scripts in the Script Pane.

10/07/2021

How to Write and Run Scripts in the Windows PowerShell ISE

How to Write and Run Scripts in the Windows PowerShell ISE

This article describes how to create, edit, run, and save scripts in the Script Pane.

How to create and run scripts

You can open and edit Windows PowerShell files in the Script Pane. Specific file types of interest
in Windows PowerShell are script files (.ps1), script data files (.psd1), and script module
files (.psm1). These file types are syntax colored in the Script Pane editor. Other common file
types you may open in the Script Pane are configuration files (.ps1xml), XML files, and text
files.

[!NOTE]
The Windows PowerShell execution policy determines whether you can run scripts and load Windows
PowerShell profiles and configuration files. The default execution policy, Restricted, prevents
all scripts from running, and prevents loading profiles. To change the execution policy to allow
profiles to load and be used, see
Set-ExecutionPolicy and
about_Signing.

To create a new script file

On the toolbar, click New, or on the File menu, click New. The created file appears in
a new file tab under the current PowerShell tab. Remember that the PowerShell tabs are only visible
when there are more than one. By default a file of type script (.ps1) is created, but it can be
saved with a new name and extension. Multiple script files can be created in the same PowerShell
tab.

To open an existing script

On the toolbar, click Open, or on the File menu, click Open. In the Open dialog
box, select the file you want to open. The opened file appears in a new tab.

To close a script tab

Click the Close icon (X) of the file tab you want to close or select the File menu and
click Close.

If the file has been altered since it was last saved, you’re prompted to save or discard it.

To display the file path

On the file tab, point to the file name. The fully qualified path to the script file appears in a
tooltip.

To run a script

On the toolbar, click Run Script, or on the File menu, click Run.

To run a portion of a script

  1. In the Script Pane, select a portion of a script.
  2. On the File menu, click Run Selection, or on the toolbar, click Run Selection.

To stop a running script

There are several ways to stop a running script.

  • Click Stop Operation on the toolbar
  • Press CTRL+BREAK
  • Select the File menu and click Stop Operation.

Pressing CTRL+C also works unless some text is currently selected, in which
case CTRL+C maps to the copy function for the selected text.

How to write and edit text in the Script Pane

You can copy, cut, paste, find, and replace text in the Script Pane. You can also undo and redo the
last action you just performed. The keyboard shortcuts for these actions are the same shortcuts
used for all Windows applications.

To enter text in the Script Pane

  1. Move the cursor to the Script Pane by clicking anywhere in the Script Pane, or by clicking Go
    to Script Pane
    in the View menu.
  2. Create a script. Syntax coloring and tab completion provide a richer editing experience in
    Windows PowerShell ISE.
  3. See How to Use Tab Completion in the Script Pane and Console Pane
    for details about using the tab completion feature to help in typing.

To find text in the Script Pane

  1. To find text anywhere, press CTRL+F or, on the Edit menu, click Find
    in Script
    .
  2. To find text after the cursor, press F3 or, on the Edit menu, click Find Next in
    Script
    .
  3. To find text before the cursor, press SHIFT+F3 or, on the Edit menu,
    click Find Previous in Script.

To find and replace text in the Script Pane

Press CTRL+H or, on the Edit menu, click Replace in Script. Enter the
text you want to find and the replacement text, then press ENTER.

To go to a particular line of text in the Script Pane

  1. In the Script Pane, press CTRL+G or, on the Edit menu, click Go to
    Line
    .

  2. Enter a line number.

To copy text in the Script Pane

  1. In the Script Pane, select the text that you want to copy.

  2. Press CTRL+C or, on the toolbar, click the Copy icon, or on the
    Edit menu, click Copy.

To cut text in the Script Pane

  1. In the Script Pane, select the text that you want to cut.
  2. Press CTRL+X or, on the toolbar, click the Cut icon, or on the Edit
    menu, click Cut.

To paste text into the Script Pane

Press CTRL+V or, on the toolbar, click the Paste icon, or on the Edit
menu, click Paste.

To undo an action in the Script Pane

Press CTRL+Z or, on the toolbar, click the Undo icon, or on the Edit
menu, click Undo.

To redo an action in the Script Pane

Press CTRL+Y or, on the toolbar, click the Redo icon, or on the Edit
menu, click Redo.

How to save a script

An asterisk appears next to the script name to mark a file that hasn’t been saved since it was
changed. The asterisk disappears when the file is saved.

To save a script

Press CTRL+S or, on the toolbar, click the Save icon, or on the File
menu, click Save.

To save and name a script

  1. On the File menu, click Save As. The Save As dialog box will appear.
  2. In the File name box, enter a name for the file.
  3. In the Save as type box, select a file type. For example, in the Save as type box,
    select ‘PowerShell Scripts (*.ps1)’.
  4. Click Save.

To save a script in ASCII encoding

By default, Windows PowerShell ISE saves new script files (.ps1), script data files (.psd1), and
script module files (.psm1) as Unicode (BigEndianUnicode). To save a script in another
encoding, such as ASCII (ANSI), use the Save or SaveAs methods on the
$psISE.CurrentFile object.

The following command saves a new script as MyScript.ps1 with ASCII encoding.

$psISE.CurrentFile.SaveAs("MyScript.ps1", [System.Text.Encoding]::ASCII)

The following command replaces the current script file with a file with the same name, but with
ASCII encoding.

$psISE.CurrentFile.Save([System.Text.Encoding]::ASCII)

The following command gets the encoding of the current file.

$psISE.CurrentFile.encoding

Windows PowerShell ISE supports the following encoding options: ASCII, BigEndianUnicode, Unicode,
UTF32, UTF7, UTF8, and Default. The value of the Default option varies with the system.

Windows PowerShell ISE doesn’t change the encoding of script files when you use the Save or
Save As commands.

See Also

  • Exploring the Windows PowerShell ISE

Привет друзья! Как и обещал, продолжаю рассказ о скриптовой оболочке Windows PowerShell, сегодня речь пойдёт о сценариях. 

Сценарии Windows PowerShell представляют собой обычные текстовые файлы с расширением .PS1, в которых записан код на языке PowerShell. Сценарии PowerShell можно писать поэтапно, непосредственно в самой оболочке, перенося затем готовый код во внешний текстовый файл. 

Автор статьи Ro8.

Сценарии в Windows PowerShell 2.0

У нас есть машина с предустановленной Windows 7 в редакции Максимальная 64 разрядная

Запускаем на данной машине от имени администратора PowerShell

Выполнив команду get-help get-service посмотрим информацию о командлете get-service

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

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

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

Для сохранения сценариев была заранее создана папка My_scripts

Сценарии будем писать используя интегрированную в Windows PowerShell среду сценариев Windows PowerShell ISE. Запускаем ее

Откроется главное окно Windows PowerShell ISE

Вводим команду get-service и выполняем ее нажав на Enter

Как видим, команда get-service успешно отработала и вывела нам список служб на данном компьютере

В правой части окна Windows PowerShell ISE пишем одну за другой две команды: clear и get-service

Команда clear выполняет очистку окна командной оболочки  PowerShell

Команда get-service выводит список служб на локальном или удаленном компьютере

Выбираем Файл-Сохранить как

Сохраним сценарий в заранее созданной папке My_scripts под именем Service. В строке Тип файла выбираем Скрипты PowerShell

Сохраненный сценарий Service.ps1

Теперь нам нужно отсортировать службы на компьютере на запущенные и остановленные

Вводим команду get-service | sort-object status и нажимаем Enter

Как видим, после выполнения команды get-service | sort-object status службы на компьютере отсортировались на остановленные и запущенные

В правой части окна Windows PowerShell ISE пишем две команды: clear и get-service | sort-object status

Команда get-service | sort-object status выводит список служб на компьютере и сортирует их на запущенные и остановленные

Выбираем Файл-Сохранить как

Сохраняем сценарий в папке My_scripts под именем Service_status

Таким образом мы имеем в папке My_scripts сценарии Service.ps1 и Service_status.ps1

Перейдем в папку My_scripts введя команду cd C:My_scripts

После перехода в папку My_scripts для просмотра ее содержимого введем команду get-childitem

Как видим, в папке My_scripts находятся два сценария Service.ps1 и Service_status.ps1

Сценарии в Windows PowerShell запускаются следующим образом: ./Script.ps1, .Script.ps1, где Script — имя сценария

Вводим команду ./Service.ps1 и выполняем сценарий

У нас появляется ошибка «Не удается загрузить файл C:My_scriptsService.ps1, так как выполнение скриптов запрещено для данной системы»

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

Всего существует четыре политики выполнения сценариев, а именно:

Restricted — запрещено выполнение любых сценариев

AllSigned — разрешается выполнение всех сценариев с доверенной цифровой подписью (локалные и удаленные)

RemoteSigned — разрешаются все локальные, а удаленные должны обладать доверенной цифровой подписью

Unrestricted — разрешено выполнение любых сценариев

Для того, чтобы определить какая политика выполнения сценариев активирована в запущенном экземпляре PowerShell, выполним команду get-executionpolicy

Как видим, в запущенном экземпляре PowerShell активирована политика выполнения сценариев Restricted, то есть в данном случае запрещено выполнение любых сценариев

Для изменения политики выполнения сценариев нужно выполнить команду set-executionpolicy «……» где вместо кавычек с точками нужно указать одну из четырех политику выполнения сценариев

Изменим политику выполнения сценариев на RemoteSigned, введя команду set-executionpolicy RemoteSigned

После выполнения команды set-executionpolicy RemoteSigned появится сообщение о том, что изменение политики выполнения сценариев может подвергнуть компьютер риску и спрашивается

действительно ли пользователь хочет изменить политику выполнения. Вводим Y и нажимаем Enter

После изменения политики выполнения на RemoteSigned убедимся, что данная политика установлена в запущенном экземпляре PowerShell, введя команду get-executionpolicy

Как видим, политика выполнения сценариев изменилась на RemoteSigned

После изменения политики выполнения сценариев запускаем наш сценарий Service.ps1, введя ./Service.ps1

Как видим, сценарий Service.ps1 отработал и отобразил нам список служб на данном компьютере

Теперь выполним сценарий Service_status.ps1, введя ./Service_status.ps1

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

Остановленные службы

Запущенные службы

Доброго времени суток дорогие читатели. В данной статье мы познакомимся с основами 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.

Окно Powershell
Окно Powershell ISE

Сразу после запуска консоли рекомендую запустить командлет Get-Help — встроенная справка по всем командлетам, аналог man в Linux.

Get-Help

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

Командлеты

Командлеты — это название команд в Powershell. Каждый командлет реализует заложенную в него функциональность. Как правило наименование командлета состоит из пары: глагол-существительное. Например: Get-Help — получить помощь. Обычно Get используется чтобы получить информация, Set — внести изменение, New — создать новый объект, политику и т.п. и Remove -удалить объект, политику и т.п.

Командлеты не чувствительны к регистру. Написать Get или get не важно, powershell воспримет эти команды одинаково.

Чтобы получить список всех доступных командлетов необходимо использовать Get-Command

Get-Command

Для получения справки по любому командлету напишите Get-Help имя-комндлета. Например

Давайте представим что нам необходимо вывести список командлетов для управления процессами. Воспользуемся Get-Command и укажем ему параметры для более точного поиска.

Get-Command *Process*

И вот мы видим список командлетов позволяющих управлять процессами: Get-Process — список всех запущенных процессов, Start-Process — запустить указанный процесс, Stop-Process— остановить указанный процесс, Wait-Process — ожидать указанный процесс. Как видно из названий командлетов можно легко понять для чего каждый служит.

Используя командлет Get-Help можно получить справку по любому командлету.

PS C:WINDOWSsystem32> Get-Help Get-Process

ИМЯ
    Get-Process

ОПИСАНИЕ
    Gets the processes that are running on the local computer or a remote computer.


СИНТАКСИС
    Get-Process [[-Name] <System.String[]>] [-ComputerName <System.String[]>] [-FileVersionInfo] [-Module] [<CommonParameters>]

    Get-Process [-ComputerName <System.String[]>] [-FileVersionInfo] -Id <System.Int32[]> [-Module] [<CommonParameters>]

    Get-Process [-ComputerName <System.String[]>] [-FileVersionInfo] -InputObject <System.Diagnostics.Process[]> [-Module] [<Com
    monParameters>]

    Get-Process -Id <System.Int32[]> -IncludeUserName [<CommonParameters>]

    Get-Process [[-Name] <System.String[]>] -IncludeUserName [<CommonParameters>]

    Get-Process -IncludeUserName -InputObject <System.Diagnostics.Process[]> [<CommonParameters>]


ОПИСАНИЕ
    The `Get-Process` cmdlet gets the processes on a local or remote computer.

    Without parameters, this cmdlet gets all of the processes on the local computer. You can also specify a particular process b
    y process name or process ID (PID) or pass a process object through the pipeline to this cmdlet.

    By default, this cmdlet returns a process object that has detailed information about the process and supports methods that l
    et you start and stop the process. You can also use the parameters of the `Get-Process` cmdlet to get file version informati
    on for the program that runs in the process and to get the modules that the process loaded.


ССЫЛКИ ПО ТЕМЕ
    Online Version: https://docs.microsoft.com/powershell/module/microsoft.powershell.management/get-process?view=powershell-5.1
    &WT.mc_id=ps-gethelp
    Debug-Process
    Get-Process
    Start-Process
    Stop-Process
    Wait-Process

ЗАМЕЧАНИЯ
    Для просмотра примеров введите: "get-help Get-Process -examples".
    Для получения дополнительных сведений введите: "get-help Get-Process -detailed".
    Для получения технических сведений введите: "get-help Get-Process -full".
    Для получения справки в Интернете введите: "get-help Get-Process -online"

При использовании командлета есть возможность указать несколько параметров при запуске. Первый параметр можно не называть. Выше я писал Get-Command *Process* где указал поиск командлетов со словом Process. Однако я не написал параметр -Name, хотя именно его и указал. Если полностью то поиск по имени выглядит так: Get-Command -Name *Process* . В случае отсутствия непосредственного указания -Name Powershell принимает в качестве имени введенное слово *Process*.

Давайте выведем список процессов с именем WhatsApp

Get-Process -Name WhatsApp -IncludeUserName
Get-Process

Мы вывели все процессы с именем WhatsApp и добавили в вывод дополнительный параметр -IncludeUserName, что позволило нам увидеть кем запущен процесс.

Алиасы

Алиасы в Powershell это по сути более короткие названия командлетов. Т.е. любому командлету можно присвоить свое короткое имя (alias). Например алиасом для командлета Get-Process является gps. Согласитесь куда проще и быстрее написать gps чем Get-Process.

Список всех alias можно получить используя командлет Get-Alias

PS C:WINDOWSsystem32> get-alias

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           % -> ForEach-Object
Alias           ? -> Where-Object
Alias           ac -> Add-Content
Alias           asnp -> Add-PSSnapin
Alias           cat -> Get-Content
Alias           cd -> Set-Location
Alias           CFS -> ConvertFrom-String                          3.1.0.0    Microsoft.PowerShell.Utility
Alias           chdir -> Set-Location
Alias           clc -> Clear-Content
Alias           clear -> Clear-Host
Alias           clhy -> Clear-History
Alias           cli -> Clear-Item
Alias           clp -> Clear-ItemProperty
Alias           cls -> Clear-Host
Alias           clv -> Clear-Variable
Alias           cnsn -> Connect-PSSession
Alias           compare -> Compare-Object
Alias           copy -> Copy-Item
Alias           cp -> Copy-Item
Alias           cpi -> Copy-Item
Alias           cpp -> Copy-ItemProperty
Alias           curl -> Invoke-WebRequest
Alias           cvpa -> Convert-Path
Alias           dbp -> Disable-PSBreakpoint
Alias           del -> Remove-Item
Alias           diff -> Compare-Object
Alias           dir -> Get-ChildItem
Alias           dnsn -> Disconnect-PSSession
Alias           ebp -> Enable-PSBreakpoint
Alias           echo -> Write-Output
Alias           epal -> Export-Alias
Alias           epcsv -> Export-Csv
Alias           epsn -> Export-PSSession
Alias           erase -> Remove-Item
Alias           etsn -> Enter-PSSession
Alias           exsn -> Exit-PSSession
Alias           fc -> Format-Custom
Alias           fhx -> Format-Hex                                  3.1.0.0    Microsoft.PowerShell.Utility
Alias           fl -> Format-List
Alias           foreach -> ForEach-Object
Alias           ft -> Format-Table
Alias           fw -> Format-Wide
Alias           gal -> Get-Alias
Alias           gbp -> Get-PSBreakpoint
Alias           gc -> Get-Content
Alias           gcb -> Get-Clipboard                               3.1.0.0    Microsoft.PowerShell.Management
Alias           gci -> Get-ChildItem
Alias           gcm -> Get-Command
Alias           gcs -> Get-PSCallStack
Alias           gdr -> Get-PSDrive
Alias           ghy -> Get-History
Alias           gi -> Get-Item
Alias           gin -> Get-ComputerInfo                            3.1.0.0    Microsoft.PowerShell.Management
Alias           gjb -> Get-Job
Alias           gl -> Get-Location
Alias           gm -> Get-Member
Alias           gmo -> Get-Module
Alias           gp -> Get-ItemProperty
Alias           gps -> Get-Process
Alias           gpv -> Get-ItemPropertyValue
Alias           group -> Group-Object
Alias           gsn -> Get-PSSession
Alias           gsnp -> Get-PSSnapin
Alias           gsv -> Get-Service
Alias           gtz -> Get-TimeZone                                3.1.0.0    Microsoft.PowerShell.Management
Alias           gu -> Get-Unique
Alias           gv -> Get-Variable
Alias           gwmi -> Get-WmiObject
Alias           h -> Get-History
Alias           history -> Get-History
Alias           icm -> Invoke-Command
Alias           iex -> Invoke-Expression
Alias           ihy -> Invoke-History
Alias           ii -> Invoke-Item
Alias           ipal -> Import-Alias
Alias           ipcsv -> Import-Csv
Alias           ipmo -> Import-Module
Alias           ipsn -> Import-PSSession
Alias           irm -> Invoke-RestMethod
Alias           ise -> powershell_ise.exe
Alias           iwmi -> Invoke-WmiMethod
Alias           iwr -> Invoke-WebRequest
Alias           kill -> Stop-Process
Alias           lp -> Out-Printer
Alias           ls -> Get-ChildItem
Alias           man -> help
Alias           md -> mkdir
Alias           measure -> Measure-Object
Alias           mi -> Move-Item
Alias           mount -> New-PSDrive
Alias           move -> Move-Item
Alias           mp -> Move-ItemProperty
Alias           mv -> Move-Item
Alias           nal -> New-Alias
Alias           ndr -> New-PSDrive
Alias           ni -> New-Item
Alias           nmo -> New-Module
Alias           npssc -> New-PSSessionConfigurationFile
Alias           nsn -> New-PSSession
Alias           nv -> New-Variable
Alias           ogv -> Out-GridView
Alias           oh -> Out-Host
Alias           popd -> Pop-Location
Alias           ps -> Get-Process
Alias           pushd -> Push-Location
Alias           pwd -> Get-Location
Alias           r -> Invoke-History
Alias           rbp -> Remove-PSBreakpoint
Alias           rcjb -> Receive-Job
Alias           rcsn -> Receive-PSSession
Alias           rd -> Remove-Item
Alias           rdr -> Remove-PSDrive
Alias           ren -> Rename-Item
Alias           ri -> Remove-Item
Alias           rjb -> Remove-Job
Alias           rm -> Remove-Item
Alias           rmdir -> Remove-Item
Alias           rmo -> Remove-Module
Alias           rni -> Rename-Item
Alias           rnp -> Rename-ItemProperty
Alias           rp -> Remove-ItemProperty
Alias           rsn -> Remove-PSSession
Alias           rsnp -> Remove-PSSnapin
Alias           rujb -> Resume-Job
Alias           rv -> Remove-Variable
Alias           rvpa -> Resolve-Path
Alias           rwmi -> Remove-WmiObject
Alias           sajb -> Start-Job
Alias           sal -> Set-Alias
Alias           saps -> Start-Process
Alias           sasv -> Start-Service
Alias           sbp -> Set-PSBreakpoint
Alias           sc -> Set-Content
Alias           scb -> Set-Clipboard                               3.1.0.0    Microsoft.PowerShell.Management
Alias           select -> Select-Object
Alias           set -> Set-Variable
Alias           shcm -> Show-Command
Alias           si -> Set-Item
Alias           sl -> Set-Location
Alias           sleep -> Start-Sleep
Alias           sls -> Select-String
Alias           sort -> Sort-Object
Alias           sp -> Set-ItemProperty
Alias           spjb -> Stop-Job
Alias           spps -> Stop-Process
Alias           spsv -> Stop-Service
Alias           start -> Start-Process
Alias           stz -> Set-TimeZone                                3.1.0.0    Microsoft.PowerShell.Management
Alias           sujb -> Suspend-Job
Alias           sv -> Set-Variable
Alias           swmi -> Set-WmiInstance
Alias           tee -> Tee-Object
Alias           trcm -> Trace-Command
Alias           type -> Get-Content
Alias           wget -> Invoke-WebRequest
Alias           where -> Where-Object
Alias           wjb -> Wait-Job
Alias           write -> Write-Output

Как видно из списка для alias использованы аналогичные по значению команды из Linux: ls, man, mount, md, kill и т.п. Видимо чтобы линуксоиду было по привычнее 🙂 Можно создать свой alias используя командлет New-Alias

Конвейер

Конвейер используется для передачи выходных данных командлета идущего вначале во входные данные командлета следующего за ним. Ничего непонятно? 🙂 Давайте на примерах, так всегда яснее.

Возьмем уже известный нам командлет Get-Process, посмотрим на его вывод

Get-Process

Как по мне многовато лишних столбцов. Мне эта информация не нужна, поэтому я выберу только нужные данные. Для таких целей служит командлет Select-Object. Давайте используем его в конвейере.

Get-Process|Select-Object ID,CPU,ProcessName
Get-Process|Sort-Object

Как вы уже наверно догадались конвейер обозначается знаком | и идет сразу следом за командлетом. И так данные по конвейеру можно передавать и дальше другим командлетам. Итак я передал выходные данные (список запущенных процессов) на вход командлета Select-Object. Который в свою очередь выбрал данные по 3 столбцам ID, CPU, ProcessName. Теперь можно передать эти данные дальше. Например выгрузить в текстовый файл

Get-Process|Select-Object ID,CPU,ProcessName|Out-File C:TMPout.txt

Просто не правда ли? У нас конвейер из трех командлетов, на выходе которого получаем текстовый файл со списком запущенных процессов и необходимой информацией по ним.

Структура объектов

В Powershell объекты играют самую важную роль. От типа объекта зависит что именно с ним можно сделать. Узнать тип объекта и вывести список всех его элементов позволяет команда Get-Member

Get-Process|get-Member

Вот далеко не полный список элементов командлета Get-Process. В данному случае тип данных это System.Diagnostics.Process

Давайте посмотрим тип данных у новой переменной

$new="Test"
$new|Get-Member
Get-Member String

В данном случае тип данных System.String т.е. строка. Что вполне логично. А теперь посмотрите что можно сделать с этой строкой с учетом указанных выше параметров.

Get-Member methods

Как видно на картинке выше мы заключаем нашу тестовую переменную $new в скобки и после них пишем точку и указываем метод. В примере я использовал три метода:

  • ToUpper — перевод всех букв в строке в верхний регистр
  • ToLower — перевод всех букв в строке в нижний регистр
  • Length — подсчитать количество символов в строке

Это всего лишь небольшой пример что можно сделать с параметрами объекта. Чаще используйте Get-Member и вы откроете для себя безграничные возможности манипуляции над объектами.

Скрипты Powershell

В самом начале статьи указал на встроенный инструмент Powershell ISE. Давайте запустим его и создадим свой первый скрипт. Кстати скрипты сохраняются в файлах с расширением ps1

Скрипт будет запускать блокнот, далее выполняется проверка если блокнот запущен выводится сообщение об этом и после блокнот закрывается. Если блокнот не запущен то выводится соответствующее сообщение об этом. На самом деле блокнот будет всегда запущен, т.к. мы вначале скрипта написали Start-Process notepad

Start-Process notepad
$a=Get-Process notepad
if ($a.ProcessName -like "Notepad")
{
Write-Host "Блокнот запущен, давайте его закроем"
Stop-Process -name notepad
}
else 
{
Write-Host "Блокнот не запущен, что поделать"
}
Powershell скрипты

В этом скрипте я использовал цикл if else. О циклах будет подробнее в следующей статье. Итак давайте сохраним скрипт и выполним его.

В ответ мы получим такую ошибку:

Невозможно загрузить файл, так как выполнение сценариев отключено в этой системе. Для получения дополнительных сведений см.
 about_Execution_Policies по адресу https:/go.microsoft.com/fwlink/?LinkID=1351
70.
    + CategoryInfo          : Ошибка безопасности: (:) [], ParentContainsError 
   RecordException
    + FullyQualifiedErrorId : UnauthorizedAccess

Все верно, изначально в WIndows запрещено выполнять скрипты Powershell. Это сделано для повышения безопасности системы. Для включения возможности запуска скриптов Powershell необходимо запустить Powershell от Администратора и ввести командлет Set-ExecutionPolicy с одним из параметров:

  • Restricted — политика по умолчанию. Выполнение всех скриптов запрещено
  • RemoteSigned — разрешено запускать собственные скрипты и подписанные доверенным разработчиком
  • AllSigned — разрешено запускать скрипты, подписанные доверенным разработчиком. Каждый раз перед запуском такого скрипта PowerShell будет запрашивать подтверждение
  • Unrestricted — в системе разрешается запускать любые скрипты

Если вы полностью уверены в запускаемых скриптах можете поставить Unrestricted. Давайте так и сделаем

Set-ExecutionPolicy -Unrestricted
Set-ExecutionPolicy

Будет предупреждение по безопасности, соглашаемся нажав Y

Можем посмотреть текущую настройку политики безопасности при помощи командлета Get-ExecutionPolicy

Get-ExecutionPolicy

В данной статье мы рассмотрели основы чтобы подготовиться писать скрипты Powershell. В следующих статьях мы более подробно изучим циклы, массивы, функции, работу со строками и много другое. Кстати вот раздел посвященный Powershell. Там много всего интересного 😉

Рекомендую к прочтению:
  • Переменные
  • Операторы сравнения
  • Операторы условий
  • Циклы
Хотите отблагодарить автора статьи? Это даст ему дополнительный стимул к написанию новых статей.

PowerShell — это новая командная оболочка для Windows, которая по задумкам Microsoft должна вытеснить и заменить cmd. По-умолчанию, эта оболочка уже идет в составе Windows 7 и выше. Если у вас более старая операционная система или вы просто хотите скачать более свежую версию PowerShell, сделать это можно здесь: https://technet.microsoft.com/en-us/scriptcenter/dd742419.aspx

Как запустить скрипт PowerShell?

Есть несколько различных способов запуска скрипта, ниже приведены основные:

  1. Запустить оболочку PowerShell и в ней запустить скрипт (ввести путь до файла и имя файла, например, так: C:Scriptstest.ps1, или перейти в папку скрипта командой cd C:Scripts и запустить его командой .test.ps1)Оболочку можно найти и запустить множеством способов. Один из способов — через меню «Пуск». Для Windows 7 — нужно зайти во «Все программы» — «Стандартные» — «Windows PowerShell» и запустить оболочку «Windows PowerShell». Для Windows 10 — нужно найти группу на букву «W» и в ней вы найдете «Windows PowerShell».
  2. Запустить «Интегрированную среду сценариев Windows PowerShell ISE» — это программа — среда разработки, позволяющая редактировать и отлаживать скрипты PowerShell, которая так же есть по-умолчанию вместе с самим PowerShell. Запустив ее, нужно просто нажать кнопку «Открыть» или зайти в меню Файл — Открыть и выбрать нужный скрипт, затем нажать F5 или кнопку «Выполнить скрипт».Найти Windows PowerShell ISE можно там же, где и оболочку PowerShell — в меню «Пуск».
  3. Запустить стандартную коммандную строку и в ней написать:
    powershell -file <имя_скрипта> (пример: powershell -file myscript.ps1)

Если вы раньше не запускали скрипты PowerShell, то скорее всего, вы получите сообщение: Не удается загрузить файл <имя_скрипта>, так как выполнение скриптов запрещено для данной системы. Введите «get-help about_signing» для получения дополнительных сведений. Связано это с тем, что из соображений безопасности и недопущения случайного выполнения вредоносного кода, все скрипты должны быть подписаны цифровой подписью.

Как разрешить выполнение неподписанного скрипта PowerShell?

1. В оболочке PowerShell, перед тем как запускать скрипт, выполнить команду, разрешающую выполнение неподписанных скриптов для текущего сеанса оболочки:

Set-ExecutionPolicy RemoteSigned -Scope Process

2. При запуске из стандартной коммандной строки использовать параметр -executionpolicy, т.е. запускать скрипт так:

powershell -executionpolicy RemoteSigned -file <имя_скрипта>

Оба способа устанавливают политику только для текущего сеанса, при этом, политика безопасности выполнения скриптов PowerShell, прописанная в реестре, не будет изменена и останется прежней. Если вы хотите поменять политику безопасности выполнения скриптов «на постоянно», то используйте такой способ:

3. Разрешить запуск навсегда: запустить оболочку PowerShell от имени «Администратора», затем выполните команду:

Set-ExecutionPolicy RemoteSigned

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

Примечание: Если скрипт был загружен из интернета, то чтобы избежать запроса на подтверждение запуска, нужно вместо RemoteSigned использовать Bypass — полное отключение любых запросов и предупреждений.

Как запустить скрипт PowerShell в фоновом режиме?

Для этого достаточно использовать параметр запуска -WindowStyle, который может принимать значения: Normal, Minimized, Maximized и Hidden. Таким образом, чтобы запустить неподписанный скрипт в фоновом режиме, нужно выполнить команду:

powershell -executionpolicy RemoteSigned -WindowStyle Hidden -file <имя_скрипта>

Так же можно еще при желании добавить -NonInteractive, чтобы скрипт не задавал никаких вопросов. Таким образом, скрипт выполнится незаметно для пользователя. Будmте внимательны, используя такой способ.

Запуск скрипта PowerShell c параметрами

Собственно запуск нужно делать как если бы вы запускали обычную программу или bat-файл с параметрами. Например, для запуска скрипта с параметрами из командной, можно написать такую команду:

powershell -executionpolicy RemoteSigned -file <имя_скрипта> param1 param2 «еще один текстовый параметр»

В самом скрипте вы можете получить эти параметры так:

param ($var1, $var2, $var3)
echo $var1, $var2, $var3

В интегрированной среде PowerShell ISE запустить скрипт с параметрами можно аналогично, используя область команд.

Как запустить скрипт PowerShell с помощью ярлыка?

Осуществить такую задачу можно двумя способами:

  1. Создать bat/cmd файл, в котором прописать команду для запуска скрипта (с параметрами вы ознакомились выше)
  2. Создать ярлык на PowerShell, который можно найти в папке c:WindowsSystem32WindowsPowerShellv<версия> и в свойствах ярлыка в поле «Объект» дописать необходимые параметры.

Таким образом, например, чтобы запустить скрипт powershell при входе пользователя, можно просто создать ярлык, как описано во 2-м пункте и поместить его в автозагрузку. Так же, создание ярлыка одним из способов выше позволит легко запустить скрипт от имени администратора или от имени любого другого пользователя как обычную программу.

Скриптовый язык PowerShell — довольно мощный инструмент для решения различных задач, но его можно использовать не только для хороших вещей, но и во вред, поэтому, пользуйтесь им с умом ;)

Понравилась статья? Поделить с друзьями:
  • Сценарий акции ко дню пожилого человека
  • Сценарий windows cmd что это
  • Сценарий акции ко дню народного единства
  • Сценарий windows cmd установка
  • Сценарий акции дня народного единства