Перейти к содержимому

Как работать с powershell

  • автор:

Руководство по Windows PowerShell для начинающих

Краткий курс по PowerShell для начинающих в администрировании Windows. Что это за скриптовый язык, что такое командлет и как им пользоваться.

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

PowerShell — это объектно-ориентированный программный движок и скриптовый язык с интерфейсом командной строки, предоставляющий широкие возможности для конфигурирования операционных систем семейства MS Windows. Он предлагает как чисто консольный интерфейс, так и полноценную среду разработки PowerShell ISE (Integrated Scripting Environment, встроенное скриптовое окружение) для скриптов.

Для запуска интерфейса командной строки введите powershell в меню «Выполнить» (WinKey + R). PowerShell ISE запускается с помощью команды «PowerShell ISE» в том же меню. ISE более предпочтительно, так как предоставляет более широкие возможности разработчику благодаря подсветке синтаксиса, функции автозаполнения кода и другим особенностям, присущим многим «большим» IDE.

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

Написание и запуск скриптов

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

Также существуют системные политики, ограничивающие выполнение скриптов. Можно проверить текущие параметры политики, введя команду Get-ExecutionPolicy . Результатом будет одно из следующих значений:

  • Restricted — выполнение скриптов запрещено. Стандартная конфигурация;
  • AllSigned — можно запускать скрипты, подписанные доверенным разработчиком; перед запуском скрипта PowerShell запросит у вас подтверждение;
  • RemoteSigned — можно запускать собственные скрипты или те, что подписаны доверенным разработчиком;
  • Unrestricted — можно запускать любые скрипты.

Для начала работы необходимо изменить настройку политики запуска на RemoteSigned, используя команду Set-ExecutionPolicy :

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

Командлеты

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

  • существуют системные, пользовательские и опциональные командлеты;
  • результатом выполнения командлета будет объект или массив объектов;
  • командлеты могут обрабатывать данные и передавать их другим командлетам с помощью конвейеров;
  • командлеты нечувствительны к регистру, так что нет никакой разницы между Get-ADUser , get-aduser и gEt-AdUsEr ;
  • в качестве разделителя используется символ ; .

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

  • Get-Process — отобразить текущие процессы, запущенные на компьютере;
  • Get-Service — отобразить список служб и их статус;
  • Get-Content — отобразить содержимое указанного файла, например Get-Content C:\Windows\System32\drivers\etc\hosts .

При необходимости список всех доступных командлетов можно вывести с помощью Get-Help-Category. Запомните эту команду — она крайне важна для тех, кто изучает PowerShell с нуля, так как помогает быстрее начать ориентироваться в его возможностях.

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

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

Параметры

У каждого командлета есть несколько параметров, определяющих его работу. PowerShell ISE автоматически предлагает все доступные параметры с отображением их типа. Например, Get-Service-NameW* выводит список служб, у которых имя начинается с W . Если вы забыли, какие параметры у введённого командлета, воспользуйтесь Get-Member .

Например, Get-Process | Get-Member :

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

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

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

Некоторые командлеты также могут вызываться с помощью алиасов. Например, вместо Get-Help можно просто написать Help — эта команда также вызовет встроенное руководство по PowerShell.

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

Конвейер

PowerShell позволяет осуществлять обмен данными между командлетами с помощью конвейера. Например:

  • GetService | SortObject -property Status — сортировка запущенных служб по статусу;
  • “Hello World!” | Out-File C:\ps\test.txt — запись текста в файл.

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

Get-Service | WHERE | SELECT displayname

Заключение

Это руководство для тех, кто изучает PowerShell с нуля, поэтому здесь раскрыты только базовые понятия и приёмы. После его прочтения у вас должно появиться представление о том, что собой представляет этот инструмент. Также мы рассмотрели варианты изменения политики выполнения скриптов, что такое командлет, как они обмениваются данными с помощью конвейера и как получить свойства нужного объекта. Помните, что в случае затруднений можно воспользоваться командлетом Get-Help – это одна из самых важных команд для начинающих изучать PowerShell.

Если пользуетесь не только Windows, но и Linux, посмотрите статью про команды терминала Linux для начинающих. В ней рассказывается про работу с процессами и файлами, навигацию, каналы, xargs, awk и grep.

Глава 1. Начало работы с PowerShell

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

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

Что нужно, чтобы начать работу с PowerShell?

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

  • Сведения об обновлении до версии PowerShell 5.1 см. в разделе Обновление существующей версии Windows PowerShell.
  • Сведения об установке последней версии PowerShell см. в статье Installing Windows PowerShell.

Где найти PowerShell?

Самый простой способ найти PowerShell в Windows 10 — ввести PowerShell в строке поиска, как показано на рис. 1-1.

Рис. 1-1. Поиск PowerShell в меню

Обратите внимание, что на рис. 1-1 показаны четыре разных ярлыка для PowerShell. Компьютер, используемый в демонстрационных целях в этой книге, работает под управлением 64-разрядной версии Windows 10, поэтому существует 64-разрядная версия консоли PowerShell и PowerShell ISE (интегрированной среды сценариев) и 32-разрядная версия каждой из них (обозначена суффиксом (x86) на ярлыках). Если вы работаете с 32-разрядной версией Windows 10, у вас будет только два ярлыка. У этих элементов нет суффикса (x86), но они являются 32-разрядными версиями. Если у вас установлена 64-разрядная операционная система, рекомендуется запускать 64-разрядную версию PowerShell, только если вас нет особой причины для запуска 32-разрядной версии.

Сведения о запуске PowerShell в других версиях Windows см. в статье Запуск Windows PowerShell.

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

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

Я запустил консоль PowerShell, щелкнув ярлык Windows PowerShell, как показано на рис. 1-1.

Рис. 1-4. Заголовок окна PowerShell

Обратите внимание, что в строке заголовка консоли PowerShell указано «Windows PowerShell», как показано на рис. 1-4. Некоторые команды выполняются нормально, но PowerShell не поддерживает управление доступом пользователей (UAC). Это означает, что оболочка не может запрашивать повышение прав для задач, требующих утверждения администратором. Выдается следующее сообщение об ошибке.

Get-Service -Name W32Time | Stop-Service 
Stop-Service : Service 'Windows Time (W32Time)' cannot be stopped due to the following error: Cannot open W32Time service on computer '.'. At line:1 char:29 + Get-Service -Name W32Time | Stop-Service + + CategoryInfo : CloseError: (System.ServiceProcess.ServiceController:ServiceController) [Stop-Service], ServiceCommandException + FullyQualifiedErrorId : CouldNotStopService,Microsoft.PowerShell.Commands.StopServiceCommand 

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

Закройте PowerShell. Перезапустите консоль PowerShell, только на этот раз щелкните правой кнопкой мыши ярлык Windows PowerShell и выберите пункт Запуск от имени администратора, как показано на рис. 1-5.

Рис. 1-5. Контекстное меню

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

Рис. 1-6

После повторного запуска PowerShell с правами администратора в строке заголовка должно быть указано «Администратор: Windows PowerShell», как показано на рис. 1-7.

Рис. 1-7

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

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

Еще раз выполните поиск PowerShell, только на этот раз щелкните ее правой кнопкой мыши и выберите пункт «Закрепить на панели задач», как показано на рис. 1-8.

Рис. 1-8

Щелкните правой кнопкой мыши ярлык PowerShell, который теперь закреплен на панели задач, и выберите пункт «Свойства», как показано на рис. 1-9.

Рис. 1-9. Управление учетными записями пользователей — ввод учетных данных

Щелкните «Дополнительно», как показано в первой части рис. 1-10, установите флажок «Запуск от имени администратора», как показано во второй части рис. 1-10, а затем дважды нажмите кнопку OK, чтобы принять изменения и выйти из обоих диалоговых окон.

Рис. 1-10. Заголовок окна

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

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

Какую версию PowerShell я использую?

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

$PSVersionTable 
Name Value ---- ----- PSVersion 5.1.19041.1 PSEdition Desktop PSCompatibleVersions BuildVersion 10.0.19041.1 CLRVersion 4.0.30319.42000 WSManStackVersion 3.0 PSRemotingProtocolVersion 2.3 SerializationVersion 1.1.0.1 

Более новые версии Windows PowerShell распространяются в составе Windows Management Framework (WMF). Конкретная версия .NET Framework зависит от версии WMF. Сведения об обновлении до версии PowerShell 5.1 см. в разделе Обновление существующей версии Windows PowerShell.

Политика выполнения

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

Версия операционной системы Windows Политика выполнения по умолчанию
Server 2019 Удаленно подписанная
Server 2016 Удаленно подписанная
Windows 10 С ограниченным доступом

Любая команда PowerShell может выполняться в интерактивном режиме, независимо от настройки политики выполнения. Политика выполнения влияет только на команды, выполняемые в сценарии. Командлет Get-ExecutionPolicy используется для определения текущего параметра политики выполнения, а командлет Set-ExecutionPolicy используется для изменения политики выполнения. Рекомендуется использовать политику RemoteSigned, которая требует, чтобы предназначенные для выполнения скачиваемые сценарии были подписаны доверенным издателем.

Проверка текущей политики выполнения

Get-ExecutionPolicy 
Restricted 

Если для политики выполнения задано С ограниченным доступом, сценарии PowerShell вообще не запускаются. Это параметр по умолчанию для всех клиентских операционных систем Windows. Чтобы продемонстрировать проблему, сохраните следующий код как файл .ps1 с именем Stop-TimeService.ps1 .

Get-Service -Name W32Time | Stop-Service -PassThru 

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

.\Stop-TimeService.ps1 
.\Stop-TimeService.ps1 : File C:\demo\Stop-TimeService.ps1 cannot be loaded because running scripts is disabled on this system. For more information, see about_Execution_Policies at http://go.microsoft.com/fwlink/?LinkID=135170. At line:1 char:1 + .\Stop-TimeService.ps1 + + CategoryInfo : SecurityError: (:) [], PSSecurityException + FullyQualifiedErrorId : UnauthorizedAccess 

Обратите внимание, что в сообщении об ошибке, приведенном в предыдущем наборе результатов, указывается точная проблема (в этой системе отключено выполнение сценариев). При выполнении в PowerShell команды, которая создает сообщение об ошибке, обязательно следует прочесть сообщение об ошибке, а не просто перезапустить команду и надеяться на ее успешное завершение.

Измените политику выполнения PowerShell на удаленно подписанную.

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned 
Execution Policy Change The execution policy helps protect you from scripts that you do not trust. Changing the execution policy might expose you to the security risks described in the about_Execution_Policies help topic at http://go.microsoft.com/fwlink/?LinkID=135170. Do you want to change the execution policy? [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "N"):y 

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

Теперь, когда для политики выполнения задано значение Удаленно подписанная, сценарий Stop-TimeService.ps1 будет выполняться без ошибок.

.\Stop-TimeService.ps1 
Status Name DisplayName ------ ---- ----------- Stopped W32Time Windows Time 

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

Start-Service -Name w32time 

Сводка

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

Просмотр

  1. Как определить версию PowerShell, установленную на компьютере?
  2. Почему важно запускать PowerShell с повышенными правами администратора?
  3. Как определить текущую политику выполнения PowerShell?
  4. Чему препятствует политика выполнения PowerShell по умолчанию на клиентских компьютерах Windows?
  5. Как изменить политику выполнения PowerShell?

Рекомендуем прочесть

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

  • about_Automatic_Variables
  • about_Hash_Tables
  • about_Execution_Policies

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

Совместная работа с нами на GitHub

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

about_Scripts

Скрипт — это обычный текстовый файл, содержащий одну или несколько команд PowerShell. Скрипты PowerShell имеют .ps1 расширение файла.

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

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

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

Запуск скрипта

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

Политика Restricted выполнения по умолчанию предотвращает выполнение всех скриптов, включая скрипты, которые записываются на локальном компьютере. Дополнительную информацию см. в разделе about_Execution_Policies.

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

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

В командной строке введите:

Set-ExecutionPolicy AllSigned 
Set-ExecutionPolicy RemoteSigned 

Изменение действует немедленно.

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

Например, для запуска сценария Get-ServiceLog.ps1 в каталоге C:\Scripts введите:

C:\Scripts\Get-ServiceLog.ps1 

Чтобы запустить скрипт в текущем каталоге, введите путь к текущему каталогу или используйте точку для представления текущего каталога, а затем путь обратной косой черты ( .\ ).

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

.\Get-ServiceLog.ps1 

Если скрипт имеет параметры, введите параметры и значения параметров после имени файла скрипта.

Например, следующая команда использует параметр ServiceName скрипта Get-ServiceLog для запроса журнала действий службы WinRM.

.\Get-ServiceLog.ps1 -ServiceName WinRM 

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

Запуск с помощью PowerShell

Начиная с PowerShell 3.0, можно запускать сценарии из проводник.

Чтобы использовать функцию «Запуск с помощью PowerShell», выполните следующие действия.

Запустите проводник, щелкните правой кнопкой мыши имя файла скрипта и выберите команду «Выполнить с помощью PowerShell».

Функция «Запуск с помощью PowerShell» предназначена для выполнения скриптов, которые не имеют необходимых параметров и не возвращают выходные данные в командную строку.

Дополнительные сведения см. в статье about_Run_With_PowerShell.

Выполнение скриптов на других компьютерах

Чтобы запустить скрипт на одном или нескольких удаленных компьютерах, используйте параметр FilePath командлета Invoke-Command .

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

Следующая команда запускает Get-ServiceLog.ps1 скрипт на удаленных компьютерах с именем Server01 и Server02.

Invoke-Command -ComputerName Server01,Server02 -FilePath ` C:\Scripts\Get-ServiceLog.ps1 

Получение справки по скриптам

Командлет Get-Help получает разделы справки для скриптов, а также командлетов и других типов команд. Чтобы получить раздел справки для скрипта, введите Get-Help путь и имя файла скрипта. Если путь к скрипту находится в Path переменной среды, можно опустить путь.

Например, чтобы получить справку по скрипту ServicesLog.ps1, введите следующее:

get-help C:\admin\scripts\ServicesLog.ps1 

Создание скрипта

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

Чтобы написать скрипт, откройте новый файл в текстовом редакторе, введите команды и сохраните их в файле с допустимым именем файла с расширением .ps1 файла.

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

$date = (get-date).dayofyear get-service | out-file "$date.log" 

Чтобы создать этот скрипт, откройте текстовый редактор или редактор скриптов, введите эти команды и сохраните их в файле с именем ServiceLog.ps1 .

Параметры в скриптах

Чтобы определить параметры в скрипте, используйте инструкцию Param. Оператор Param должен быть первым оператором в скрипте, за исключением комментариев и любых #Require инструкций.

Параметры скрипта работают как параметры функции. Значения параметров доступны для всех команд в скрипте. Все функции параметров функции, включая атрибут «Параметр» и его именованные аргументы, также допустимы в скриптах.

При запуске скрипта пользователи скрипта введите параметры после имени скрипта.

В следующем примере показан Test-Remote.ps1 сценарий с параметром ComputerName . Обе функции скрипта могут получить доступ к значению параметра ComputerName .

param ($ComputerName = $(throw "ComputerName parameter is required.")) function CanPing < $error.clear() $tmp = test-connection $computername -erroraction SilentlyContinue if (!$?) else > function CanRemote < $s = new-pssession $computername -erroraction SilentlyContinue if ($s -is [System.Management.Automation.Runspaces.PSSession]) else > if (CanPing $computername)

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

C:\PS> .\test-remote.ps1 -computername Server01 Ping succeeded: Server01 Remote test failed: Server01 

Дополнительные сведения об инструкции Param и параметрах функции см. в about_Functions и about_Functions_Advanced_Parameters.

Справка по написанию скриптов

Вы можете написать раздел справки для скрипта с помощью одного из двух следующих методов:

  • Справка на основе комментариев для сценариев Создайте раздел справки с помощью специальных ключевое слово в комментариях. Чтобы создать справку на основе комментариев для скрипта, комментарии должны размещаться в начале или конце файла скрипта. Дополнительные сведения о справке на основе комментариев см. в about_Comment_Based_Help .
  • Справка на основе XML для сценариев Создайте раздел справки на основе XML, например тип, который обычно создается для командлетов. Справка на основе XML требуется, если вы переводите разделы справки на несколько языков.

Чтобы связать скрипт с разделом справки на основе XML, используйте раздел справки. Ключевое слово примечания внешней справкиHelp. Дополнительные сведения о ключевое слово ExternalHelp см. в about_Comment_Based_Help . Дополнительные сведения о справке на основе XML см. в статье «Создание справки по командлетам».

Возврат значения выхода

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

В Windows любое число между [int]::MinValue и [int]::MaxValue разрешено.

В Unix разрешены только положительные числа между [byte]::MinValue (0) и [byte]::MaxValue (255). Отрицательное число в диапазоне -1 -255 через автоматически преобразуется в положительное число путем добавления 256. Например, -2 преобразуется 254 в .

В PowerShell exit инструкция задает значение переменной $LASTEXITCODE . В командной оболочке Windows (cmd.exe) инструкция выхода задает значение переменной %ERRORLEVEL% среды.

Любой аргумент, который является нечисленным или вне диапазона для конкретной платформы, преобразуется в значение 0 .

Скрипт область и точечный набор элементов

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

Чтобы запустить скрипт в другой область, можно указать область, например Global или Local, или указать исходный скрипт.

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

Чтобы указать исходный скрипт, введите точку (.) и пробел перед путем скрипта.

. C:\scripts\UtilityFunctions.ps1 
. .\UtilityFunctions.ps1 

После выполнения скрипта UtilityFunctions.ps1 функции и переменные, создаваемые скриптом, добавляются в текущую область.

Например, UtilityFunctions.ps1 скрипт создает New-Profile функцию и $ProfileName переменную.

#In UtilityFunctions.ps1 function New-Profile < Write-Host "Running New-Profile function" $profileName = split-path $profile -leaf if (test-path $profile) else > 

При запуске скрипта UtilityFunctions.ps1 в собственном скрипте область New-Profile функция и $ProfileName переменная существуют только во время выполнения скрипта. Когда скрипт завершает работу, функция и переменная удаляются, как показано в следующем примере.

C:\PS> .\UtilityFunctions.ps1 C:\PS> New-Profile The term 'new-profile' is not recognized as a cmdlet, function, operable program, or script file. Verify the term and try again. At line:1 char:12 + new-profile $profileName C:\PS> 

При точке источника скрипта и его запуске скрипт создает New-Profile функцию и $ProfileName переменную в сеансе в область. После выполнения скрипта можно использовать New-Profile функцию в сеансе, как показано в следующем примере.

C:\PS> . .\UtilityFunctions.ps1 C:\PS> New-Profile Directory: C:\Users\juneb\Documents\WindowsPowerShell Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 1/14/2009 3:08 PM 0 Microsoft.PowerShellISE_profile.ps1 C:\PS> $profileName Microsoft.PowerShellISE_profile.ps1 

Дополнительные сведения о область см. в about_Scopes .

Скрипты в модулях

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

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

Дополнительные сведения о модулях см. в about_Modules .

Другие функции скрипта

PowerShell имеет множество полезных функций, которые можно использовать в сценариях.

  • #Requires — Инструкцию #Requires можно использовать для предотвращения запуска скрипта без указанных модулей или оснастки и указанной версии PowerShell. Дополнительные сведения см. в about_Requires .
  • $PSCommandPath — содержит полный путь и имя выполняемого скрипта. Этот параметр действителен во всех скриптах. Эта автоматическая переменная представлена в PowerShell 3.0.
  • $PSScriptRoot — содержит каталог, из которого выполняется скрипт. В PowerShell 2.0 эта переменная действительна только в модулях скриптов ( .psm1 ). Начиная с PowerShell 3.0, он действителен во всех сценариях.
  • $MyInvocation — Автоматическая $MyInvocation переменная содержит сведения о текущем скрипте, включая сведения о том, как он был запущен или «вызван». Эту переменную и ее свойства можно использовать для получения сведений о скрипте во время его выполнения. Например, объект $MyInvocation . Переменная MyCommand.Path содержит путь и имя файла скрипта. $MyInvocation . Строка содержит команду, которая запустила скрипт, включая все параметры и значения. Начиная с PowerShell 3.0, имеет два новых свойства, $MyInvocation которые предоставляют сведения о скрипте, который вызвал или вызвал текущий скрипт. Значения этих свойств заполняются только в том случае, если вызывающий или вызывающий объект является скриптом.
    • PSCommandPath содержит полный путь и имя скрипта, который вызвал или вызвал текущий скрипт.
    • PSScriptRoot содержит каталог скрипта, который вызвал или вызвал текущий скрипт.

    $PSCommandPath В отличие от и автоматических переменных, которые содержат сведения о текущем скрипте, свойства $MyInvocation PSCommandPath и $PSScriptRoot PSScriptRoot переменной содержат сведения о скрипте, который называется текущим скриптом.

    См. также

    • about_Command_Precedence
    • about_Comment_Based_Help
    • about_Execution_Policies
    • about_Functions
    • about_Modules
    • about_Profiles
    • about_Requires
    • about_Run_With_PowerShell
    • about_Scopes
    • about_Script_Blocks
    • about_Signing
    • Invoke-Command

    Совместная работа с нами на GitHub

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

    Основы Windows PowerShell

    Рассказали, о технологии Windows PowerShell и как начать с ней работать.

    Изображение записи

    Рассказываем про Windows PowerShell — технологию для автоматизации рутинных задач, пришедшую на смену bat-файлам.

    Работа с консолью Microsoft Windows

    Ранее мы рассматривали командные интерпретаторы COMMAND.CMD и CMD.EXE, обеспечивающие автоматизацию задач в семействе операционных систем Microsoft Windows. Фактически данные интерпретаторы не получали обновлений с начала 2000-х годов и существуют в современных операционных системах для обеспечения совместимости.

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

    Помимо отсутствия обновлений, CMD.EXE имеет ограниченный функционал. Он не позволяет писать сложную логику и полностью отказаться от использования графического интерфейса. Корпорация Microsoft пыталась решить эти проблемы с помощью инструмента под названием Microsoft Script Host, который имел интеграцию со скриптовыми языками JScript и VBScript.

    Однако Microsoft Script Host имел ряд собственных проблем:

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

    Все это побуждало Microsoft сделать командный интерпретатор с нуля.

    Новый командный интерпретатор Windows PowerShell

    В 2003 году корпорация Microsoft начала разработку нового инструмента — Microsoft Shell (MSH), или Monad. Спустя три года и три бета-версии Monad была официально выпущена под новым названием Windows PowerShell 1.0 на Windows XP и Windows Vista. По ходу развития командная оболочка меняла свои названия на PowerShell Core и PowerShell.

    При создании PowerShell разработчики задались целью создать инструмент, который позволил бы с легкостью использовать множество разнородных интерфейсов, предоставляемых операционной системой. Новый инструмент должен быть консистентным и легким для администратора, несмотря на количество технологий «под капотом». Например, PowerShell предоставляет доступ к API .NET-фреймворка, но не требует от администратора знания .NET.

    Как и любой командный интерпретатор, PowerShell умеет запускать исполняемые файлы и имеет встроенные команды. Однако у PowerShell встроенные команды имеют название «командлет», появившееся от английского cmdlet.

    Что такое командлет?

    В основе взаимодействия с PowerShell лежат объекты, а не текст, как у CMD.EXE и командных интерпретаторов в *nix-системах. Такой подход меняет взгляд на организацию встроенных команд.

    Командлет — это встроенная команда в PowerShell, выполняющая одну задачу и реализованная на .NET. Имя командлета соответствует правилу Глагол-Существительное, которое можно читать как Действие-Объект.

    Самый важный командлет, о котором необходимо узнать в первую очередь, — Get-Help. Он отображает справочную информацию о PowerShell и командлетах.

    # Получить общую справку по PowerShell Get-Help # Получить справку по командлету Get-Content Get-Help Get-Content # Получить справку по командлету Get-Help Get-Help Get-Help 

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

    Get-Help Get-Help get-help get-help GET-HELP GET-HELP GeT-hElP gEt-HeLp 

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

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

    Основы программы PowerShell

    Перейдем к практике. PowerShell является кроссплатформенным инструментом и может быть запущена на Linux и macOS, но в данной статье будет рассматриваться только «родное» окружение — Windows.

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

    Программа в меню

    Запуск PowerShell можно произвести из меню поиска около кнопки Пуск, набрав powershell.

    PowerShell в меню

    Аналогично можно запустить PowerShell через диалоговое окно Выполнить…, которое открывается через сочетание клавиш Windows + R.

    Если по каким-то причинам у вас не установлен PowerShell, то необходимо сделать это, следуя инструкции в базе знаний Microsoft.

    Установка PowerShell

    В случае успеха откроется синее окно. Windows PowerShell готов к вашим командам.

    Синтаксис

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

    Get-Help Get-Command -Online

    Данная команда откроет в браузере вкладку с описанием командлета Get-Command в базе знаний Microsoft. Разберем подробнее:

    • Get-Help – команда, в данном случае командлет,
    • Get-Command – первый позиционный аргумент, который передается командлету,
    • -Online – ключ, то есть именованный аргумент.

    Обратите внимание, что в CMD.EXE именованные аргументы, то есть ключи, для встроенных команд начинались с символа слэш (/). У командлетов аргументы начинаются со знака минус. Использование знака / в PowerShell недопустимо и будет интерпретировано как ошибка.

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

    function Get-Version

    Данный код объявит функцию Get-Version, которая обращается к системной переменной (объекту) PSVersionTable и возвращает значение поля PSVersion. Проще говоря, выводит версию PowerShell.

    Именование командлетов может быть неочевидным для администраторов с опытом работы с другими командными интерпретаторами. Поэтому рассмотрим основные команды Windows PowerShell.

    Основные команды языка Windows PowerShell

    В следующей таблице перечислены основные команды PowerShell и их аналоги в *nix-подобных системах и CMD.EXE. В версии PowerShell 7 количество командлетов превышает полторы тысячи!

    Командлет (псевдоним) Команда в *nix Команда в CMD.exe Описание
    Get-Location (pwd) pwd Выводит путь до текущего каталога
    Set-Location (cd) cd cd Меняет текущий каталог
    Get-ChildItem (ls) ls dir Выводит содержимое текущего каталога
    Get-ChildItem find find Производит поиск файлов по заданным критериям
    Copy-Item (cp) cp cp Копирует файл
    Remove-Item (rm) rm rm Удаляет файл
    New-Item (mkdir) mkdir mkdir Создает каталог
    New-Item touch Создает пустой файл
    Get-Content (cat) cat Выводит файлы
    Get-Content tail Выводит последние 10 строк
    Where-Object grep Производит фильтрацию
    Create-Volume
    Format-Volume
    mkfs Форматирует раздел
    Test-Connection ping ping.exe Отправляет ICMP-запросы, «пингует»
    Get-Help (man) man help Показывает справку

    После работы в консоли *nix командлет для популярного действия, смены каталога, выглядит громоздко и непривычно. К счастью, командлеты имеют псевдонимы (алиасы), которые могут не следовать правилу именования командлетов. Список известных псевдонимов можно получить с помощью командлета Get-Alias.

    Хотя таблица, представленная выше, значительно облегчит назначение командлетов, не стоит ожидать от командлетов поведения как в *nix-системах. Так, например, в PowerShell командлет Get-Content создан для вывода содержимого одного файла на экран, в то время как на *nix-системах утилита cat изначально использовалась для конкатенации (процесса соединения) нескольких файлов с последующим выводом на экран.

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

    Утилита ping

    Отдельно хочется отметить командлет Test-Connection, который делает то же самое, что утилита ping, но не имеет такого алиса. Разница между утилитой и командлетом в формате вывода: утилита выводит текст, а командлет возвращает объект, который можно использовать в конвейерах.

    Конвейер PowerShell: особенности и параметры

    По своей задумке конвейеры в PowerShell не отличаются от конвейеров в *nix-системах: они перенаправляют вывод одной команды на ввод другой. Как отмечалось ранее, в PowerShell происходит взаимодействие не с текстом, а с объектами. При выводе на экран объект трансформируется в таблицу, чтобы человеку было удобнее читать, но не всегда таблица выводит все поля объекта.

    Особенность конвейеров PowerShell заключается в том, что конвейер передает результат не целиком, а по одному объекту. Командлет Test-Connection выводит четыре объекта: по одному на каждый ICMP-запрос. Если подключить командлет к конвейеру, то можно увидеть подтверждение этому тезису. Воспользуемся командлетом Select-Object, чтобы выбрать колонку со временем запроса.

    Test-Connection selectel.ru | Select-Object ‘Time(ms)’

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

    Test-connection

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

    PS C:\Users\sun> Test-connection selectel.ru | Get-Member TypeName: System.Management.ManagementObject#root\cimv2\Win32_PingStatus Name MemberType Definition ---- ---------- ---------- PSComputerName AliasProperty PSComputerName = __SERVER Address Property string Address BufferSize Property uint32 BufferSize NoFragmentation Property bool NoFragmentation PrimaryAddressResolutionStatus Property uint32 PrimaryAddressResolutionStatus ProtocolAddress Property string ProtocolAddress ProtocolAddressResolved Property string ProtocolAddressResolved RecordRoute Property uint32 RecordRoute ReplyInconsistency Property bool ReplyInconsistency ReplySize Property uint32 ReplySize ResolveAddressNames Property bool ResolveAddressNames ResponseTime Property uint32 ResponseTime ResponseTimeToLive Property uint32 ResponseTimeToLive RouteRecord Property string[] RouteRecord RouteRecordResolved Property string[] RouteRecordResolved SourceRoute Property string SourceRoute SourceRouteType Property uint32 SourceRouteType StatusCode Property uint32 StatusCode Timeout Property uint32 Timeout TimeStampRecord Property uint32[] TimeStampRecord TimeStampRecordAddress Property string[] TimeStampRecordAddress TimeStampRecordAddressResolved Property string[] TimeStampRecordAddressResolved TimestampRoute Property uint32 TimestampRoute TimeToLive Property uint32 TimeToLive TypeofService Property uint32 TypeofService __CLASS Property string __CLASS __DERIVATION Property string[] __DERIVATION __DYNASTY Property string __DYNASTY __GENUS Property int __GENUS __NAMESPACE Property string __NAMESPACE __PATH Property string __PATH __PROPERTY_COUNT Property int __PROPERTY_COUNT __RELPATH Property string __RELPATH __SERVER Property string __SERVER __SUPERCLASS Property string __SUPERCLASS ConvertFromDateTime ScriptMethod System.Object ConvertFromDateTime(); ConvertToDateTime ScriptMethod System.Object ConvertToDateTime(); IPV4Address ScriptProperty System.Object IPV4Address  

    Можно визуально оценить список и найти поле ResponseTime. Также в начале указан тип данного объекта, Win32_PingStatus, информацию о котором можно поискать в базе знаний Microsoft. В документации не только перечислены поля, но и их назначение. Таким образом, конечный вид конвейера будет таким:

    Test-connection selectel.ru | Select-Object ResponseTime

    Хотя PowerShell побуждает к интерактивной работе, его основное предназначение — автоматизировать рутинные задачи. Значит, необходимо писать скрипты.

    Используйте PowerShell в работе с выделенным сервером

    Соберите сервер в конфигураторе под свои задачи. Или выберите из более 100 готовых.

    Интегрированная среда разработки

    Среда разработки

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

    PowerShell-скрипты — это текстовые файлы с расширением .ps1.

    Windows PowerShell ISE — это интегрированная среда сценариев PowerShell, включающая в себя:

    • редактор PowerShell-скриптов с автодополнением,
    • окно для интерактивного выполнения командлетов в скрипте,
    • список доступных командлетов с поиском.

    Перечень команд

    Справка Test-Connection

    Обратите внимание, что модуль ISE предоставляет графический интерфейс для генерации аргументов командлета. Помимо генерации команд, в функции модуля также входит вызов «справочника» по командлетам, аналогичного Get-Help, только в графическом интерфейсе.

    После написания своего первого PowerShell-скрипта вы столкнетесь с некоторыми ограничениями. Во-первых, файл с расширением ps1 нельзя запустить «двойным кликом» по файлу. Необходимо открыть контекстное меню с помощью правой клавиши мыши и выбрать Запустить с помощью PowerShell.

    Во-вторых, скрипт не запустится со следующей ошибкой:

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

    По умолчанию запуск PowerShell-скриптов ограничен соответствующей политикой безопасности. Посмотреть текущее значение политики безопасности можно с помощью командлет Get-ExecutionPolicy:

    PS C:\Users\sun> Get-ExecutionPolicy Restricted 

    Список возможных значений:

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

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

    Set-ExecutionPolicy RemoteSigned

    Для выполнения данной команды необходимо запустить PowerShell от имени администратора.

    Выполнение задач в фоне

    Консоль PowerShell

    PowerShell позволяет выполнять задачи в фоновом режиме, эту функциональность обеспечивают командлеты с существительным Job:

    • Start-Job — запустить команду или командлет в фоновом режиме,
    • Get-Job — показать состояние фоновых команд,
    • Wait-Job — дождаться завершения выполнения фоновой команды,
    • Receive-Job — получить результат выполнения команды.

    Командлет Start-Job возвращает информацию о запущенном фоновом задании. Идентификатор, обозначенный в поле Id, является уникальным для сессии PowerShell.

    Настройка удаленного выполнения

    PowerShell позволяет реализовать удаленное выполнение командлетов, скриптов, но только на платформе Windows. Для включения возможности удаленного управления необходимо выполнить командлет Enable-PSRemoting с правами администратора.

    Командлет Enter-PSSession запустит удаленную интерактивную сессию, а Invoke-Command выполнит команду на одном или нескольких удаленных компьютерах.

    PowerShell – актуальные версии программы

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

    На момент написания статьи актуальная версия PowerShell — 7.2. Используйте этот текст в качестве краткого справочника по Windows PowerShell, администрирование систем со скриптами в этой программе будет довольно простым.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *