Рассказываем про Windows PowerShell — технологию для автоматизации рутинных задач, пришедшую на смену bat-файлам.
Работа с консолью Microsoft Windows
Ранее мы рассматривали командные интерпретаторы COMMAND.CMD и CMD.EXE, обеспечивающие автоматизацию задач в семействе операционных систем Microsoft Windows. Фактически данные интерпретаторы не получали обновлений с начала 2000-х годов и существуют в современных операционных системах для обеспечения совместимости.
Подробнее о bat-файлах →
Хотя современные операционные системы предлагают богатый на функции графический интерфейс, ряд однотипных задач быстрее решается через консоль. Более того, серверные редакции ОС не предоставляют графический интерфейс по умолчанию, поэтому интерпретатор командной строки является неотъемлемой частью практически любой операционной системы.
Помимо отсутствия обновлений, CMD.EXE имеет ограниченный функционал. Он не позволяет писать сложную логику и полностью отказаться от использования графического интерфейса. Корпорация Microsoft пыталась решить эти проблемы с помощью инструмента под названием Microsoft Script Host, который имел интеграцию со скриптовыми языками JScript и VBScript.
Однако Microsoft Script Host имел ряд собственных проблем:
- плохо интегрировался с командной оболочкой операционной системы,
- сопровождался скудной документацией,
- разные версии Windows имели командные интерпретаторы с разным набором команд,
- инструмент становился отличным вектором для атак.
Все это побуждало Microsoft сделать командный интерпретатор с нуля.
В 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 через диалоговое окно Выполнить…, которое открывается через сочетание клавиш Windows + R.
Если по каким-то причинам у вас не установлен PowerShell, то необходимо сделать это, следуя инструкции в базе знаний Microsoft.
В случае успеха откроется синее окно. 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 {
$PSVersionTable.PSVersion
}
Данный код объявит функцию 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, несмотря на отсутствие специальных команд. Однако эти команды требуют опыта или смекалки.
Отдельно хочется отметить командлет Test-Connection, который делает то же самое, что утилита ping, но не имеет такого алиса. Разница между утилитой и командлетом в формате вывода: утилита выводит текст, а командлет возвращает объект, который можно использовать в конвейерах.
Конвейер PowerShell: особенности и параметры
По своей задумке конвейеры в PowerShell не отличаются от конвейеров в *nix-системах: они перенаправляют вывод одной команды на ввод другой. Как отмечалось ранее, в PowerShell происходит взаимодействие не с текстом, а с объектами. При выводе на экран объект трансформируется в таблицу, чтобы человеку было удобнее читать, но не всегда таблица выводит все поля объекта.
Особенность конвейеров PowerShell заключается в том, что конвейер передает результат не целиком, а по одному объекту. Командлет Test-Connection выводит четыре объекта: по одному на каждый ICMP-запрос. Если подключить командлет к конвейеру, то можно увидеть подтверждение этому тезису. Воспользуемся командлетом Select-Object, чтобы выбрать колонку со временем запроса.
Test-Connection selectel.ru | Select-Object ‘Time(ms)’
После запуска данной команды можно наблюдать, как с некоторой задержкой печатаются пустые строки по одной.
Но как же так? Дело в том, что отображение объекта при выводе на экран не всегда соответствует имени поля в объекте. Чтобы получить полный список полей в объекте, необходимо вызвать командлет Get-Member.
PS C:Userssun> Test-connection selectel.ru | Get-Member
TypeName: System.Management.ManagementObject#rootcimv2Win32_PingStatus
Name MemberType Definition
---- ---------- ----------
PSComputerName AliasProperty PSComputerName = __SERVER
Address Property string Address {get;set;}
BufferSize Property uint32 BufferSize {get;set;}
NoFragmentation Property bool NoFragmentation {get;set;}
PrimaryAddressResolutionStatus Property uint32 PrimaryAddressResolutionStatus {get;set;}
ProtocolAddress Property string ProtocolAddress {get;set;}
ProtocolAddressResolved Property string ProtocolAddressResolved {get;set;}
RecordRoute Property uint32 RecordRoute {get;set;}
ReplyInconsistency Property bool ReplyInconsistency {get;set;}
ReplySize Property uint32 ReplySize {get;set;}
ResolveAddressNames Property bool ResolveAddressNames {get;set;}
ResponseTime Property uint32 ResponseTime {get;set;}
ResponseTimeToLive Property uint32 ResponseTimeToLive {get;set;}
RouteRecord Property string[] RouteRecord {get;set;}
RouteRecordResolved Property string[] RouteRecordResolved {get;set;}
SourceRoute Property string SourceRoute {get;set;}
SourceRouteType Property uint32 SourceRouteType {get;set;}
StatusCode Property uint32 StatusCode {get;set;}
Timeout Property uint32 Timeout {get;set;}
TimeStampRecord Property uint32[] TimeStampRecord {get;set;}
TimeStampRecordAddress Property string[] TimeStampRecordAddress {get;set;}
TimeStampRecordAddressResolved Property string[] TimeStampRecordAddressResolved {get;set;}
TimestampRoute Property uint32 TimestampRoute {get;set;}
TimeToLive Property uint32 TimeToLive {get;set;}
TypeofService Property uint32 TypeofService {get;set;}
__CLASS Property string __CLASS {get;set;}
__DERIVATION Property string[] __DERIVATION {get;set;}
__DYNASTY Property string __DYNASTY {get;set;}
__GENUS Property int __GENUS {get;set;}
__NAMESPACE Property string __NAMESPACE {get;set;}
__PATH Property string __PATH {get;set;}
__PROPERTY_COUNT Property int __PROPERTY_COUNT {get;set;}
__RELPATH Property string __RELPATH {get;set;}
__SERVER Property string __SERVER {get;set;}
__SUPERCLASS Property string __SUPERCLASS {get;set;}
ConvertFromDateTime ScriptMethod System.Object ConvertFromDateTime();
ConvertToDateTime ScriptMethod System.Object ConvertToDateTime();
IPV4Address ScriptProperty System.Object IPV4Address {get=$iphost = [System.Net.Dns]:...
IPV6Address ScriptProperty System.Object IPV6Address {get=$iphost = [System.Net.Dns]:...
Можно визуально оценить список и найти поле 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-скриптов с автодополнением,
- окно для интерактивного выполнения командлетов в скрипте,
- список доступных командлетов с поиском.
Обратите внимание, что модуль ISE предоставляет графический интерфейс для генерации аргументов командлета. Помимо генерации команд, в функции модуля также входит вызов «справочника» по командлетам, аналогичного Get-Help, только в графическом интерфейсе.
После написания своего первого PowerShell-скрипта вы столкнетесь с некоторыми ограничениями. Во-первых, файл с расширением ps1 нельзя запустить «двойным кликом» по файлу. Необходимо открыть контекстное меню с помощью правой клавиши мыши и выбрать Запустить с помощью PowerShell.
Во-вторых, скрипт не запустится со следующей ошибкой:
Невозможно загрузить файл C:UserssunDocumentsHelloWorld.ps1, так как выполнение сценариев отключено в этой системе. Для получения дополнительных сведений см. about_Execution_Policies по адресу https:/go.microsoft.com/fwlink/
?LinkID=135170.
+ CategoryInfo : Ошибка безопасности: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnauthorizedAccess
По умолчанию запуск PowerShell-скриптов ограничен соответствующей политикой безопасности. Посмотреть текущее значение политики безопасности можно с помощью командлет Get-ExecutionPolicy:
PS C:Userssun> Get-ExecutionPolicy
Restricted
Список возможных значений:
- Restricted — запуск запрещен,
- AllSigned — разрешен только запуск подписанных доверенным разработчиком скриптов,
- RemoteSigned — разрешен запуск подписанных и собственных скриптов,
- Unrestricted — разрешен запуск любых скриптов.
По умолчанию стоит значение Restricted. В идеале необходимо подписывать скрипты, но для собственных нужд можно ограничиться значением RemoteSigned:
Set-ExecutionPolicy RemoteSigned
Для выполнения данной команды необходимо запустить 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, администрирование систем со скриптами в этой программе будет довольно простым.
Только автоматизация. Только PowerShell.
Предисловие
В качестве хобби и при наличии времени преподаю студентам в УКИТ (бывший Московский государственный колледж информационных технологий). На данный момент у меня мало времени, чтобы уделить его группе студентов, зато вполне достаточно, чтобы подготовить пост здесь, на Хабре.
Я работаю системным администратором в крупной не ИТ-компании с большой завязкой на ИТ ресурсы. По роду деятельности представляется решать большое количество однотипных задач по обслуживанию пользователей.
С языком PowerShell познакомился около двух лет назад, но вплотную занялся им лишь спустя год, не осознав поначалу его огромных возможностей. В статье, прежде всего, я буду ориентироваться на тех, кто хочет начать работать с PowerShell, но пока не доверяет ему или не знает, с какой стороны подступиться к этому чуду.
Внимание: PowerShell вызывает привыкание.
Введение
Википедия говорит нам:
Windows PowerShell — расширяемое средство автоматизации от Microsoft, состоящее из оболочки с интерфейсом командной строки и сопутствующего языка сценариев.
Выглядеть среда PowerShell может так, как командная строка:
powershell.exe
Или в виде приложения:
powershell_ise.exe
Powershell_ise.exe называется интегрированной средой сценариев — Windows PowerShell ISE. Позволяет работать с языком в удобной среде с подсветкой синтаксиса, конструктором команд, автозаполнением команд по нажатию TAB и прочими прелестями. Идеальна для создания и тестирования сценариев.
Для запуска среды powershell.exe или powershell_ise.exe достаточно набрать аналогичное название в строке выполнить.
Файл сценария PowerShell имеет расширение .ps1.
Сценарий не получится запустить двойным ЛКМ. Это сделано специально для того, чтобы не нанести вред системе случайно запущенным скриптом.
Для запуска, по клику ПКМ следует выбрать «Выполнить с помощью PowerShell»:
Помимо того, что существует ограничение по запуску сценариев ЛКМ, по умолчанию выполнение сценариев в системе запрещено, опять же, по описанной выше причине — не нанести вред системе. Для проверки текущей политики выполнения выполним команду:
Get-ExecutionPolicy
Мы получим одно из следующих ниже значений. С большой вероятностью, если это был первый запуск, мы получим Restricted.
- Restricted — Сценарии не могут быть запущены;
- AllSigned — Могут быть запущены только сценарии, подписанные доверенным издателем. Перед выполнением сценария доверенного издателя будет запрашиваться подтверждение;
- RemoteSigned — Разрешено выполнять созданные нами сценарии и скачанные сценарии, подписанные доверенным издателем;
- Unrestricted — Никаких ограничений, все скрипты могут быть запущены.
Для выполнения и тестирования понизим политику до RemoteSigned выполнив команду:
Set-ExecutionPolicy RemoteSigned
Приступаем к работе
Командлет
- Командлетами называются команды PowerShell, в которых заложена различная функциональность;
- Командлеты могут быть как системными, так и пользовательскими, созданные кем-либо;
- Командлеты именуются по правилу Глагол-Существительное, что упрощает их запоминание;
- Командлеты выводят результаты в виде объектов или их коллекций;
- Командлеты могут как получать данные для обработки, так и передавать данные по конвейеру (про конвейеры позже);
- Командлеты не чувствительны к регистру (можно написать и get-process, и Get-Process, и GeT-pRoCeSs);
- После командлетов не обязательно ставить «;«, за исключением, когда мы выполняем несколько командлетов в одну строку (Get-Process; Get-Services).
Например, для получения текущих процессов, мы выполним команду:
Get-Process
И получим результат:
Попробуйте самостоятельно выполнить:
Get-Service #для получения статуса служб, запущенных на компьютерах
Get-Content C:WindowsSystem32driversetchosts #для получения содержимого файла. В данном случае, файл hosts
Не обязательно знать наизусть все командлеты. Get-Help спасёт ситуацию.
Информацию о всех доступных командлетах можно получить, введя следующую команду:
Get-Help -Category cmdlet
Если мы используем PowerShell ISE, мы облегчаем процесс разработки.
Достаточно ввести знак тире «—» после того, как ввели командлет, и мы получим все возможные варианты параметров и их типы:
Попробуйте выполнить:
Get-Service -Name p*
Если, всё же, мы забудем какие свойства есть у того или иного командлета, прогоним его через Get-Member:
Get-Process | Get-Member
#Знак "|" называется конвейером. О нём ниже.
Недостаточно информации? Обратимся к справке с параметром -Examples:
Get-Help Get-Process -Examples
Получаем описание Get-Process, да ещё и с примерами использования:
- Командлеты могут иметь сокращённые названия — алиасы. Например, вместо Get-Help можно использовать просто Help. Для получения всех сокращений выполните Get-Alias.
Попробуйте выполнить:
Start-Process notepad
Что аналогично записи:
start notepad
А теперь остановим процесс:
Stop-Process -Name notepad
Или так:
spps -Name notepad
Немногим ранее мы сказали, что командлеты именуются по правилу Глагол-Существительное. Уточню, что глагол не обязательно должен быть Get. Помимо того, что мы можем получать, мы можем задавать Set (помните, Set-ExecutionPolicy), запускать Start, останавливать Stop, выводить Out, создавать New и многие другие. Название командлета ни чем не ограничивается и, когда мы будем с вами создавать свой собственный, сможем назвать его так, как душе угодно.
Попробуем выполнить вывод в файл:
"Hello, Habr!" | Out-File C:test.txt
& C:test.txt
Кстати, аналогично можно записать так:
"Hello, Habr!" > C:test.txt
& C:test.txt
Комментарии
Мы все знаем, использовать комментарии является хорошим тоном.
Комментарии в PowerShell бывают строчные — # и блочные — <#… #>:
Обратим внимание, на код из примера:
Get-WmiObject -Class Win32_OperatingSystem | SELECT Caption
Для тех, кто знаком с WMI, кто делает это на старом добром VBScript, помните, сколько кода надо написать?
On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:\" & strComputer & "rootcimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem",,48)
For Each objItem in colItems
Wscript.Echo "Caption: " & objItem.Caption
Next
Конвейер
Конвейер (|) — передаёт выходные данные одной команды во входные данные на обработку другой команде. Мы использовали конвейер ранее, получая все свойства объекта или, в предыдущем примере, выбирая из набора данных только поле Caption.
Чтобы понять принцип конвейера, давайте выполним код:
Get-Service | Sort-Object -property Status
Что произойдёт: получаем все службы (Get-Service), передаём все полученные службы на сортировку в командлет Sort-Object и указываем, что хотим отсортировать их по параметру Status. На выводе мы получим сначала все службы со статусом Stop, а потом все службы со статусом Running.
В примере ниже мы сначала получим все запущенные службы. После первого конвейера проходимся по каждому элементу, выбираем только те службы, у которых статус Running и на втором конвейере выбираем, что хотим на выводе увидеть только displayname служб:
Get-Service | WHERE {$_.status -eq "Running"} | SELECT displayname
В примере мы используем $_. Данная запись означает текущий элемент в конвейере.
Послесловие
В этой части мы научились запускать PowerShell, разобрались с политикой выполнения сценариев. Поняли, что такое командлеты, знаем, как передавать их по конвейеру и как получить их свойства. Если мы что-то забудем, обязательно Get-Help.
Все это знания нужные для того, чтобы сделать первый прыжок в язык. Поверьте, ещё много интересного!
Продолжение следует…
Дополнительная информация
- Jump Start в PowerShell (часть II);
- Скачать PowerShell v.5 бесплатно без регистрации;
- Замечательный курс на MVA: Расширенные возможности и написание скриптов в PowerShell 3.0 (Jump Start). Мой совет — посмотрите первые 3 блока, окунитесь в язык, попробуйте повыполнять какие-нибудь задачи и через недельку смотрите оставшиеся блоки. Русские субтитры;
- Видео в тему на TechDays;
Галерея скриптов PowerShell на Technet;
Блог разработчиков PowerShell.
Доброго времени суток дорогие читатели. В данной статье мы познакомимся с основами Powershell. Данный язык программирования используется во всех ОС Microsoft начиная с Windows XP SP3. Писать Powershell скрипты должен уметь каждый уважающий себя системный администратор windows.
Все команды в Powershell как правило используются в форме командлетов. Все командлеты это специализированные классы .NET Framework и .NET Core (используется в PowerShell Core 6 и выше).
Powershell класса .NET Framework это версии с 1 по 5.1 а Powershell .NET Core это версия 6 и выше (на данный момент 7.0). По заявлению Microsoft новых функций в Powershell 5.1 (.NET Framework) вносить уже не будут. Однако 7 версия еще не полностью поддерживает все модули предыдущих версий. Но судя по всему Microsoft стремится к этому и скоро версия Core будет единственной. В общем cmd отходит в прошлое и теперь без Powershell никуда. Давайте приступим к практике. Так всегда лучше запоминается материал.
Запуск Powershell
На примере Windows 10 Powershell можно запустить просто нажав правой кнопкой мыши на меню пуск.
Также нижняя строчка позволяет запустить Powershell с повышенными правами администратора.
Еще можно воспользоваться поиском в WIndows 10 и ввести название powershell
Как видно на картинке выше нашелся не только Powershell но и Powershell ISE. Консоль powershell удобна если требуется запустить последовательно не больше одной команды. Либо несколько команд в конвейере. Однако в случае написания полноценных скриптов лучше использовать Powershell ISE. Это бесплатная среда разработки сценариев на языке Powershell поставляется вместе с ОС Windows.
Сразу после запуска консоли рекомендую запустить командлет Get-Help — встроенная справка по всем командлетам, аналог man в Linux.
Видим что консоль предлагает обновить встроенную помощь. Нажимаем Y и соглашаемся.
Командлеты
Командлеты — это название команд в Powershell. Каждый командлет реализует заложенную в него функциональность. Как правило наименование командлета состоит из пары: глагол-существительное. Например: Get-Help — получить помощь. Обычно Get используется чтобы получить информация, Set — внести изменение, New — создать новый объект, политику и т.п. и Remove -удалить объект, политику и т.п.
Командлеты не чувствительны к регистру. Написать Get или get не важно, powershell воспримет эти команды одинаково.
Чтобы получить список всех доступных командлетов необходимо использовать Get-Command
Для получения справки по любому командлету напишите Get-Help имя-комндлета. Например
Давайте представим что нам необходимо вывести список командлетов для управления процессами. Воспользуемся Get-Command и укажем ему параметры для более точного поиска.
И вот мы видим список командлетов позволяющих управлять процессами: Get-Process — список всех запущенных процессов, Start-Process — запустить указанный процесс, Stop-Process— остановить указанный процесс, Wait-Process — ожидать указанный процесс. Как видно из названий командлетов можно легко понять для чего каждый служит.
Используя командлет Get-Help можно получить справку по любому командлету.
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
Мы вывели все процессы с именем 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, посмотрим на его вывод
Как по мне многовато лишних столбцов. Мне эта информация не нужна, поэтому я выберу только нужные данные. Для таких целей служит командлет Select-Object. Давайте используем его в конвейере.
Get-Process|Select-Object ID,CPU,ProcessName
Как вы уже наверно догадались конвейер обозначается знаком | и идет сразу следом за командлетом. И так данные по конвейеру можно передавать и дальше другим командлетам. Итак я передал выходные данные (список запущенных процессов) на вход командлета Select-Object. Который в свою очередь выбрал данные по 3 столбцам ID, CPU, ProcessName. Теперь можно передать эти данные дальше. Например выгрузить в текстовый файл
Get-Process|Select-Object ID,CPU,ProcessName|Out-File C:TMPout.txt
Просто не правда ли? У нас конвейер из трех командлетов, на выходе которого получаем текстовый файл со списком запущенных процессов и необходимой информацией по ним.
Структура объектов
В Powershell объекты играют самую важную роль. От типа объекта зависит что именно с ним можно сделать. Узнать тип объекта и вывести список всех его элементов позволяет команда Get-Member
Вот далеко не полный список элементов командлета Get-Process. В данному случае тип данных это System.Diagnostics.Process
Давайте посмотрим тип данных у новой переменной
$new="Test" $new|Get-Member
В данном случае тип данных System.String т.е. строка. Что вполне логично. А теперь посмотрите что можно сделать с этой строкой с учетом указанных выше параметров.
Как видно на картинке выше мы заключаем нашу тестовую переменную $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 "Блокнот не запущен, что поделать" }
В этом скрипте я использовал цикл 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
Будет предупреждение по безопасности, соглашаемся нажав Y
Можем посмотреть текущую настройку политики безопасности при помощи командлета Get-ExecutionPolicy
В данной статье мы рассмотрели основы чтобы подготовиться писать скрипты Powershell. В следующих статьях мы более подробно изучим циклы, массивы, функции, работу со строками и много другое. Кстати вот раздел посвященный Powershell. Там много всего интересного 😉
Рекомендую к прочтению:
- Переменные
- Операторы сравнения
- Операторы условий
- Циклы
Хотите отблагодарить автора статьи? Это даст ему дополнительный стимул к написанию новых статей.
В этой статье про PowerShell для начинающих мы посмотрим, как писать скрипты, которые помогают оптимизировать управление Windows-окружением.
PowerShell — это объектно-ориентированный программный движок и скриптовый язык с интерфейсом командной строки, предоставляющий широкие возможности для конфигурирования операционных систем семейства MS Windows. Он предлагает как чисто консольный интерфейс, так и полноценную среду разработки PowerShell ISE (Integrated Scripting Environment, встроенное скриптовое окружение) для скриптов.
Для запуска интерфейса командной строки введите powershell
в меню «Выполнить» (WinKey + R). PowerShell ISE запускается с помощью команды «PowerShell ISE» в том же меню. ISE более предпочтительно, так как предоставляет более широкие возможности разработчику благодаря подсветке синтаксиса, функции автозаполнения кода и другим особенностям, присущим многим «большим» IDE.
Среда разработки Windows PowerShell ISE
Написание и запуск скриптов
Скрипты сохраняются в виде файлов с расширением .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:WindowsSystem32driversetchosts
.
При необходимости список всех доступных командлетов можно вывести с помощью Get-Help-Category. Запомните эту команду — она крайне важна для тех, кто изучает PowerShell с нуля, так как помогает быстрее начать ориентироваться в его возможностях.
Результат выполнения команды Get-Help-Category
Также можно создавать свои командлеты, но эта тема выходит за рамки нашего руководства по PowerShell для начинающих.
Параметры
У каждого командлета есть несколько параметров, определяющих его работу. PowerShell ISE автоматически предлагает все доступные параметры с отображением их типа. Например, Get-Service-NameW*
выводит список служб, у которых имя начинается с W
. Если вы забыли, какие параметры у введённого командлета, воспользуйтесь Get-Member
.
Например, Get-Process | Get-Member
:
Список параметров командлета Get-Process
Если вы не нашли того, что нужно, или не уверены в том, как правильно задаются параметры, можно даже запросить примеры с помощью параметра -Examples
. Встроенное руководство по PowerShell покажет, для чего используются разные параметры:
Примеры использования командлета
Некоторые командлеты также могут вызываться с помощью алиасов. Например, вместо Get-Help
можно просто написать Help
— эта команда также вызовет встроенное руководство по PowerShell.
При написании больших скриптов или коллективной разработке можно пользоваться комментариями. Каждый комментарий начинается с символа #
, а блок комментариев ограничивается комбинациями символов <#
и #>
в начале и в конце соответственно.
Конвейер
PowerShell позволяет осуществлять обмен данными между командлетами с помощью конвейера. Например:
GetService | SortObject -property Status
— сортировка запущенных служб по статусу;“Hello World!” | Out-File C:pstest.txt
— запись текста в файл.
Можно использовать несколько конвейеров. Например, следующий скрипт выводит список имён всех служб за исключением остановленных:
Get-Service | WHERE {$_.status -eq “Running”} | SELECT displayname
Заключение
Это руководство для тех, кто изучает PowerShell с нуля, поэтому здесь раскрыты только базовые понятия и приёмы. После его прочтения у вас должно появиться представление о том, что собой представляет этот инструмент. Также мы рассмотрели варианты изменения политики выполнения скриптов, что такое командлет, как они обмениваются данными с помощью конвейера и как получить свойства нужного объекта. Помните, что в случае затруднений можно воспользоваться командлетом Get-Help — это одна из самых важных команд для начинающих изучать PowerShell.
Если пользуетесь не только Windows, но и Linux, посмотрите статью про команды терминала Linux для начинающих. В ней рассказывается про работу с процессами и файлами, навигацию, каналы, xargs, awk и grep.
Перевод статьи «Windows PowerShell Scripting Tutorial for Beginners»
PowerShell — это новая командная оболочка для Windows, которая по задумкам Microsoft должна вытеснить и заменить cmd. По-умолчанию, эта оболочка уже идет в составе Windows 7 и выше. Если у вас более старая операционная система или вы просто хотите скачать более свежую версию PowerShell, сделать это можно здесь: https://technet.microsoft.com/en-us/scriptcenter/dd742419.aspx
Как запустить скрипт PowerShell?
Есть несколько различных способов запуска скрипта, ниже приведены основные:
- Запустить оболочку PowerShell и в ней запустить скрипт (ввести путь до файла и имя файла, например, так: C:Scriptstest.ps1, или перейти в папку скрипта командой cd C:Scripts и запустить его командой .test.ps1)Оболочку можно найти и запустить множеством способов. Один из способов — через меню «Пуск». Для Windows 7 — нужно зайти во «Все программы» — «Стандартные» — «Windows PowerShell» и запустить оболочку «Windows PowerShell». Для Windows 10 — нужно найти группу на букву «W» и в ней вы найдете «Windows PowerShell».
- Запустить «Интегрированную среду сценариев Windows PowerShell ISE» — это программа — среда разработки, позволяющая редактировать и отлаживать скрипты PowerShell, которая так же есть по-умолчанию вместе с самим PowerShell. Запустив ее, нужно просто нажать кнопку «Открыть» или зайти в меню Файл — Открыть и выбрать нужный скрипт, затем нажать F5 или кнопку «Выполнить скрипт».Найти Windows PowerShell ISE можно там же, где и оболочку PowerShell — в меню «Пуск».
- Запустить стандартную коммандную строку и в ней написать:
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 с помощью ярлыка?
Осуществить такую задачу можно двумя способами:
- Создать bat/cmd файл, в котором прописать команду для запуска скрипта (с параметрами вы ознакомились выше)
- Создать ярлык на PowerShell, который можно найти в папке c:WindowsSystem32WindowsPowerShellv<версия> и в свойствах ярлыка в поле «Объект» дописать необходимые параметры.
Таким образом, например, чтобы запустить скрипт powershell при входе пользователя, можно просто создать ярлык, как описано во 2-м пункте и поместить его в автозагрузку. Так же, создание ярлыка одним из способов выше позволит легко запустить скрипт от имени администратора или от имени любого другого пользователя как обычную программу.
Скриптовый язык PowerShell — довольно мощный инструмент для решения различных задач, но его можно использовать не только для хороших вещей, но и во вред, поэтому, пользуйтесь им с умом
Когда дело доходит до запуска команд в Windows, PowerShell стал чем-то вроде туза в дыре. В течение многих лет энтузиасты ограничивались рамками командной строки Windows, но в 2006 году PowerShell стала мощной альтернативой..
Contents
- 1 Что такое PowerShell?
- 2 Команды PowerShell
- 3 Шпаргалка PowerShell (PDF)
- 4 Как использовать PowerShell
- 5 PowerShell против командной строки
- 6 Загрузка PowerShell
- 7 Как запустить командлеты
- 8 Как запускать скрипты
- 9 Перекрываются с помощью команд Windows
- 10 Резервное копирование базы данных SQL
- 11 Основные команды PowerShell
- 11.1 Получить помощь
- 11.2 Get-Service
- 11.3 ConvertTo-HTML
- 11.4 Экспорт-CSV (и Get-Сервис)
- 11.5 Get-Process
- 11.6 Get-EventLog
- 11.7 Stop-Process
- 12 PowerShell: мощный интерфейс командной строки
PowerShell — это интерактивный Интерфейс командной строки (CLI) и механизм автоматизации, разработанный Microsoft для разработки конфигураций системы и автоматизации административных задач. Этот инструмент имеет собственную командную строку с уникальным языком программирования, похожим на Perl. Изначально PowerShell был разработан для управления объектами на компьютерах пользователей..
Сегодня PowerShell предлагает пользователям обширную среду, в которой они могут выполнять и автоматизировать задачи управления системой. Пользователь может получить доступ к ресурсам из Active Directory на Exchange Server через одну программу. По своей сути PowerShell позволяет пользователю получить доступ к:
- Командная строка
- Команды PowerShell
- .NET Framework API
- Инструментарий управления Windows
- Компонентная объектная модель Windows
Поскольку PowerShell стал приложением с открытым исходным кодом, пользователи Linux и Unix теперь могут получить доступ к этой универсальной платформе. PowerShell в основном используется, чтобы помочь пользователям автоматизировать административные задания. Вместо выполнения утомительных и повторяющихся задач пользователь может просто создавать сценарии и выполнять команды, и PowerShell выполнит их автоматически. Пользователь может настроить сотни команд, называемых командлеты.
Команды PowerShell
Вот 25 основных команд PowerShell:
Имя команды AliasDescription
Set-Location | cd, chdir, sl | Устанавливает текущее рабочее место в указанное место. |
Get-Content | кот, gc, тип | Получает содержимое элемента в указанном месте. |
Добавить контент | переменный ток | Добавляет содержимое к указанным элементам, например, добавляет слова в файл. |
Set-Content | Южная Каролина | Записывает или заменяет содержимое элемента новым содержимым. |
Copy-Item | копировать, cp, cpi | Копирует элемент из одного места в другое. |
Удалить объект | del, erase, rd, ri, rm, rmdir | Удаляет указанные элементы. |
Move-Item | ми, двигаться, мв | Перемещает элемент из одного места в другое. |
Set-Item | си | Изменяет значение элемента на значение, указанное в команде. |
New-Item | п | Создает новый предмет. |
Start-Job | sajb | Запускает фоновое задание Windows PowerShell. |
Compare-Object | сравнить, диф | Сравнивает два набора объектов. |
Group-Object | группа | Группирует объекты, содержащие одинаковое значение для указанных свойств. |
Invoke-WebRequest | завиток, IWR, Wget | Получает контент с веб-страницы в Интернете. |
Мера-объект | мера | Вычисляет числовые свойства объектов, а также символы, слова и строки в строковых объектах, таких как файлы… |
Resolve-Path | rvpa | Разрешает символы подстановки в пути и отображает содержимое пути. |
Резюме-Job | rujb | Возобновляет приостановленную работу |
Set-Variable | установить, св | Устанавливает значение переменной. Создает переменную, если переменная с запрошенным именем не существует. |
Show-Command | shcm | Создает команды Windows PowerShell в графическом окне команд. |
Сортировка-объект | Сортировать | Сортирует объекты по значениям свойств. |
Start-Service | sasv | Запускает одну или несколько остановленных служб. |
Запуск процесса | Соки, начало | Запускает один или несколько процессов на локальном компьютере. |
Приостановить-Job | sujb | Временно останавливает задания рабочего процесса. |
Wait-Job | WJB | Подавляет командную строку, пока одно или все фоновые задания Windows PowerShell, запущенные в сеансе, не будут… |
Where-Object | ?, где | Выбирает объекты из коллекции на основе значений их свойств. |
Write-Output | эхо, пиши | Посылает указанные объекты следующей команде в конвейер. Если команда является последней командой в конвейере,… |
Вот наша PDF-версия Шпаргалки PowerShell. Нажмите на изображение ниже, чтобы открыть PDF в отдельной вкладке браузера, которую вы можете сохранить и использовать в качестве краткого справочника..
Шпаргалка PowerShell (PDF)
Как использовать PowerShell
PowerShell идеально подходит для корпоративных администраторов, которые выполняют сложные операции управления в крупных корпоративных сетях. Вместо того, чтобы собирать информацию о сотнях различных серверов и служб вручную (что может занять много времени), вы можете просто запустить скрипт на PowerShell, чтобы автоматически передавать информацию обратно вам.
Вообще говоря, PowerShell наиболее полезен для пользователей, которые ранее имели опыт работы с командной строкой. Чтобы использовать PowerShell, вы можете запускать различные командлеты, сценарии, исполняемые файлы и классы .NET. В этой статье мы сосредоточимся в основном на командлетах и сценариях, чтобы помочь вам разобраться с основами.
У Удеми есть несколько лучших курсов по PowerShell, которые могут оказаться полезными.
PowerShell против командной строки
Для многих пользователей PowerShell является лучшей альтернативой командной строке. Причина в том, что у него просто больше лошадиных сил. Одно из самых больших отличий заключается в том, что PowerShell использует командлеты, а не команды. Командлеты размещают управление реестром и инструментарий управления Windows в пределах досягаемости пользователей. Командная строка, напротив, ограничена гораздо более простыми командами.
Существует синтаксис между двумя платформами, так как PowerShell будет принимать некоторые команды командной строки, такие как ipconfigtocd. Однако они известны как псевдонимы, а не командлеты. Другое ключевое отличие заключается в том, что PowerShell сосредоточен на объектах. Каждый фрагмент данных, выводимый из командлета, является объектом, а не текстом. Это облегчает пользователю навигацию по сложным данным. Включение .NET Framework также позволяет сценариям PowerShell использовать интерфейсы .NET. Короче говоря, PowerShell — это командная строка на стероидах.
Загрузка PowerShell
Прежде чем мы углубимся в основы использования PowerShell, вам сначала необходимо получить доступ к основному интерфейсу. Если вы являетесь пользователем Windows 10, то у вас уже будет доступ к PowerShell 5. Пользователи Windows 8-8.1 имеют доступ к PowerShell 4, но если вы работаете в Windows 7, вам нужно будет установить его в .NET фреймворк. Во всех операционных системах PowerShell предлагает два различных интерфейса.
Более продвинутой является интегрированная среда сценариев, которая выступает в качестве комплексного графического интерфейса для опытных пользователей. Основной альтернативой является консоль PowerShell, которая предоставляет пользователю командную строку для ввода своих команд. Новичкам рекомендуется придерживаться последних, пока они не изучат основы PowerShell.
Чтобы запустить PowerShell в Windows 10, вам необходимо быть администратором. Войдите в систему как администратор, нажмите Начало, и прокрутите свои приложения, пока не найдете Windows PowerShell. Щелкните правой кнопкой мыши и выберите Запустить от имени администратора. В Windows 8.1 просто найдите PowerShell в своем система папки. Аналогично, в Windows 7 каталог по умолчанию для PowerShell — это аксессуары папка после того, как вы установили программу.
Как запустить командлеты
В двух словах, командлет — это однофункциональная команда. Вы вводите командлеты в командную строку, как если бы вы использовали обычную команду или утилиту. Командлеты являются основным способом взаимодействия с CLI. В PowerShell большинство командлетов написаны на C # и состоят из инструкций, предназначенных для выполнения функции, возвращающей объект .NET..
В PowerShell можно использовать более 200 командлетов. В командной строке Windows PowerShell не учитывается регистр, поэтому эти команды можно вводить как в верхнем, так и в нижнем регистре. Основные командлеты перечислены ниже:
- Get-Location — Получить текущий каталог
- Set-Location — Получить текущий каталог
- Move-пункт — Переместить файл в новое место
- Прописи пункт — Скопируйте файл в новое место
- Rename — пункт Переименовать существующий файл
- New-пункт — создать новый файл
Для получения полного списка доступных вам команд используйте командлет Get-Command. В командной строке вы должны ввести следующее:
PS C: > Get-Command
Важно отметить, что Microsoft запрещает пользователям использовать собственные командлеты PowerShell в своих настройках по умолчанию. Чтобы использовать командлеты PowerShell, необходимо изменить ExecutionPolicy из Ограниченный в RemoteSigned. Удаленная подпись позволит вам запускать свои собственные сценарии, но остановит неподписанные сценарии от других пользователей.
Чтобы изменить политику выполнения, введите следующую команду PowerShell:
PS C: > Set-ExecutionPolicy
Поменять на RemoteSigned, введите следующую команду:
PS C: > Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
Убедитесь, что вы находитесь в учетной записи администратора, чтобы у вас было разрешение на установку новой политики выполнения.
Как запускать скрипты
Основанные на сценариях процессы и команды являются частью универсальности PowerShell. В PowerShell сценарий представляет собой текстовый файл с расширением ps1 в имени файла. Чтобы создать новый сценарий, вы можете просто открыть блокнот Windows, ввести свои команды и сохранить с помощью «.ps1» в конце имени.
Чтобы запустить скрипт, введите его папку и имя файла в окне PowerShell:
PS c: powershell mynewscript.ps1
Как только вы это сделаете, выбранный вами скрипт будет запущен.
Хотите создать свои собственные скрипты PowerShell? Почти 5 тысяч студентов прошли этот курс удемского языка по расширенным сценариям с помощью PowerShell.
Перекрываются с помощью команд Windows
Когда вы новичок в PowerShell, вы можете испытать огромные трудности, пытаясь освоить совершенно новую библиотеку команд. Однако большинство новых пользователей не осознают, что синтаксис, используемый в командной строке Windows, перекрывается с PowerShell. Это облегчается тем фактом, что PowerShell не учитывает регистр.
Как и в командной строке, в PowerShell команда cd по-прежнему меняет каталоги, а dir по-прежнему предоставляет список файлов в выбранной папке. Поэтому важно помнить, что вы не обязательно начинаете с нуля. Принятие этого на вооружение поможет уменьшить кривую обучения, с которой вы сталкиваетесь при использовании PowerShell, и уменьшит количество новых команд, которые вы должны выучить.
При этом важно отметить, что они не считаются полными командами PowerShell, а являются псевдонимами (имя Powershell для команд командной строки Windows). Поэтому, хотя вы можете попробовать некоторые из команд командной строки в PowerShell, вы должны узнать как можно больше о новых. Тем не менее, опыт командной строки, безусловно, может помочь новым пользователям осваивать PowerShell и приступить к работе..
Резервное копирование базы данных SQL
Многие люди используют PowerShell для резервного копирования баз данных SQL. Интерфейс командной строки может выполнять полное резервное копирование базы данных, резервное копирование файлов и журналов транзакций. Существует много способов резервного копирования базы данных в PowerShell, но одним из самых простых является использование команды Backup-SqlDatabase. Например:
PS C: > Backup-SqlDatabase -ServerINstance «Компьютер Экземпляр» -Database «Databasecentral»
Это создаст резервную копию базы данных с именем «Databasecentral» (или именем выбранной вами базы данных)..
Для резервного копирования журнала транзакций вы должны ввести:
PS C: > Backup-SqlDatabase -ServerInstance «Компьютер Экземпляр» -Database «Databasecentral» -BackupAction Log
Это создаст журнал транзакций выбранной базы данных.
Основные команды PowerShell
Использование псевдонимов только поможет вам понять PowerShell, поэтому важно посвятить себя изучению всех возможностей собственных команд PowerShell. Мы затронули некоторые из них выше, но мы разберем основные из них более подробно ниже..
Получить помощь
Эта команда должна быть в самом верху списка любого нового пользователя, когда дело доходит до PowerShell. Команду Get-Help можно использовать для буквального получения справки по любой другой команде PowerShell. Например, если вы знаете имя команды, но не знаете, что она делает или как ее использовать, команда Get-Help предоставляет полный синтаксис команды.
Например, если вы хотите посмотреть, как работает Get-Process, введите:
PS C: > Get-Help -Name Get-ProcessPS C: > Set-ExecutionPolicy
Как уже упоминалось ранее в этом руководстве, у Microsoft есть ограниченная политика выполнения, которая запрещает выполнение сценариев в PowerShell, если вы не измените ее. При настройке политики выполнения у вас есть четыре варианта на выбор:
- Ограниченный — Политика выполнения по умолчанию, которая останавливает выполнение скриптов.
- Все подписано — Запустит сценарии, если они подписаны доверенным издателем
- Удаленная подпись — Позволяет запускать скрипты, которые были созданы локально
- неограниченный — Политика без ограничений на запуск скриптов
PS C: > Get-ExecutionPolicy
Если вы используете PowerShell, вы не всегда можете работать на сервере, с которым вы знакомы. Выполнение команды Политика Get-Execution позволит вам увидеть, какая политика активна на сервере, прежде чем запускать новый скрипт. Если затем вы увидите, что рассматриваемый сервер работает с ограниченной политикой, вы можете реализовать Set-ExecutionPolicy команда изменить его.
Get-Service
Одной из наиболее важных команд является Get-Service, которая предоставляет пользователю список всех служб, установленных в системе, как работающих, так и остановленных. Этот командлет может быть направлен с использованием определенных имен служб или объектов.
Например, если вы набрали PS C: > Get-Service, вам будет показан список всех служб на вашем компьютере, их статусы и отображаемые имена.
Чтобы использовать эту команду для получения определенных служб, введите: PS C: Get-Service «WMI *», чтобы получить все службы, начинающиеся с WMI..
Если вы хотите ограничить вывод активными службами на вашем компьютере, введите следующую команду:
PS C: Get-Service | Where-Object {$ _. Status -eq «Выполняется»}
ConvertTo-HTML
При использовании PowerShell вы можете создать отчет о просмотренной вами информации. Один из лучших способов сделать это, используя ConvertTo-HTML команда. Этот командлет позволяет создавать отчеты с таблицами и цветом, что может помочь визуализировать сложные данные. Просто выберите объект и добавьте его в команду. Например, вы можете ввести:
Get-PSDrive | ConvertTo-Html
Это возвращает массу информации, поэтому рекомендуется ограничить ее файлом с помощью команды Out-File. Лучшая альтернативная команда:
Get-PSD Drive | ConvertTo-Html | Out-File -FilePath PSDrives.html
Затем будет сгенерирован HTML-файл в виде таблицы. Например:
Затем вы можете добавить свои собственные цвета и границы, чтобы уточнить его представление.
Экспорт-CSV (и Get-Сервис)
Не менее важной для увеличения видимости является команда Export-CSV. Это позволяет экспортировать данные PowerShell в файл CSV. По сути, эта команда создает файл CSV, компилирующий все объекты, выбранные вами в PowerShell. Каждый объект имеет свою собственную строку или строку в файле CSV. Эта команда в основном используется для создания электронных таблиц и обмена данными с внешними программами.
Чтобы использовать эту команду, вы должны набрать:
PS C: > Get-Service | Export-CSV c: service.csv
Важно помнить, что не нужно форматировать объекты перед запуском команды Export-CSV. Это связано с тем, что форматирование объектов приводит к тому, что в файл CSV помещаются только отформатированные свойства, а не сами исходные объекты. В случае, если вы хотите отправить определенные свойства объекта в файл CSV, вы должны использовать Select-Object командлет.
Чтобы использовать Select-Object командлет, тип:
PS C: > Get-Service | Выбор-Имя объекта, Статус | Export-CSV c: Service.csv
Get-Process
Если вы хотите просмотреть все процессы, запущенные в вашей системе, Get-Process Команда очень важна. Чтобы получить список всех активных процессов на вашем компьютере, введите:
PS C: Get-Process
Обратите внимание, что если вы не укажете какие-либо параметры, вы получите разбивку всех активных процессов на вашем компьютере. Чтобы выбрать конкретный процесс, сузьте результаты по имени процесса или идентификатору процесса и объедините его с Format-List Командлет, который отображает все доступные свойства. Например:
PS C: Get-Process Windowrd, проводник | Формат-Список *
Это дает вам полный контроль над всеми активными процессами.
Get-EventLog
Если вы когда-нибудь захотите получить доступ к журналам событий вашего компьютера (или журналам на удаленных компьютерах) при использовании PowerShell, то вам понадобится Get-EventLog команда. Этот командлет работает только с классическими журналами событий, поэтому вам понадобится Get-WinEvent команда для журналов позже, чем Windows Vista.
Чтобы запустить команду журнала событий, введите:
PS C: > Get-EventLog -List
Это покажет все журналы событий на вашем компьютере.
Одна из наиболее распространенных причин, по которой пользователи просматривают журналы событий, — это ошибки. Если вы хотите видеть ошибки в вашем журнале, просто введите:
PS C: > Get-EventLog -LogName System -EntryType Ошибка
Если вы хотите получать журналы событий с нескольких компьютеров, укажите, какие устройства вы хотите просмотреть (перечислены ниже как «Сервер1» и «Сервер2»). Например:
PS C: > Get-EventLog — LogName «Windows PowerShell» -ComputerName «локальный компьютер», «Server1», «Server2».
Параметры, которые вы можете использовать для поиска в журналах событий:
- После — Пользователь указывает дату и время, а командлет будет определять события, которые произошли после
- AsBaseObject — Предоставляет System.Diagnostics.EventLogEntry для каждого события
- AsString — возвращает вывод в виде строк
- Перед — Пользователь указывает дату и время, а командлет будет находить события, которые произошли до
- Имя компьютера — Используется для обозначения удаленного компьютера
- EntryType — Указывает тип записи событий (Ошибка, Аудит отказов, Аудит успеха, Информация, Предупреждение)
- Показатель — Указывает значения индекса, из которого командлет находит события
- Список — Предоставляет список журналов событий
- UserName — Определяет имена пользователей, связанные с данным событием
Stop-Process
При использовании PowerShell нередки случаи зависания процесса. Всякий раз, когда это происходит, вы можете использовать Get-Process получить имя процесса, испытывающего трудности, а затем остановить его с помощью Stop-Process команда. Как правило, вы завершаете процесс по его имени. Например:
PS C: > Stop-Process -Название «Блокнот»
В этом примере пользователь завершил работу Блокнота с помощью команды Stop-Process.
PowerShell: мощный интерфейс командной строки
Хотя переход на PowerShell может показаться довольно сложным, его интерфейс командной строки работает практически так же, как и любой другой. У него могут быть свои уникальные командлеты, но множество онлайн-ресурсов может помочь вам в решении любых административных задач. Чтобы максимально использовать возможности PowerShell, вам просто нужно привыкнуть к множеству доступных вам команд..
Будучи новым пользователем, легко напасть на 200 с лишним командлетов PowerShell. Убедитесь, что вы начинаете с интерфейса командной строки, прежде чем перейти к полноценному графическому интерфейсу. Независимо от того, являетесь ли вы новичком в PowerShell или интерфейсах командной строки, в Интернете доступно более чем достаточно информации, чтобы помочь вам максимально эффективно использовать этот мощный инструмент.