PowerShell учебник
Начало работы с PowerShell
Поиск…
замечания
Windows PowerShell - это компонент оболочки и сценариев в системе управления Windows, инфраструктура управления автоматизацией и конфигурацией, разработанная Microsoft, основанная на .NET Framework. PowerShell устанавливается по умолчанию во всех поддерживаемых версиях клиентских и серверных операционных систем Windows с Windows 7 / Windows Server 2008 R2. Powershell можно обновить в любое время, загрузив более позднюю версию Windows Management Framework (WMF). Версия «Alpha» PowerShell 6 является кросс-платформенной (Windows, Linux и OS X) и ее необходимо загрузить и установить с этой страницы выпуска .
Дополнительные ресурсы:
- Документация MSDN: https://msdn.microsoft.com/en-us/powershell/scripting/powershell-scripting
- TechNet: https://technet.microsoft.com/en-us/scriptcenter/dd742419.aspx
- Галерея PowerShell: https://www.powershellgallery.com/
- Блог MSDN: https://blogs.msdn.microsoft.com/powershell/
- Github: https://github.com/powershell
- Сайт сообщества: http://powershell.com/cs/
Версии
Версия | Включено в Windows | Заметки | Дата выхода |
---|---|---|---|
1,0 | XP / Server 2008 | 2006-11-01 | |
2,0 | 7 / Server 2008 R2 | 2009-11-01 | |
3.0 | 8 / Сервер 2012 | 2012-08-01 | |
4,0 | 8.1 / Сервер 2012 R2 | 2013-11-01 | |
5.0 | 10 / Технический обзор сервера 2016 | 2015-12-16 | |
5,1 | 10 Юбилейная версия / Сервер 2016 | 2017-01-27 |
Установка или настройка
Windows
PowerShell входит в состав Windows Management Framework. Установка и настройка не требуются в современных версиях Windows.
Обновления PowerShell можно выполнить, установив новую версию Windows Management Framework.
Другие платформы
«Beta» версия PowerShell 6 может быть установлена на других платформах. Пакеты установки доступны здесь .
Например, PowerShell 6 для Ubuntu 16.04 публикуется для пакетных репозиториев для простой установки (и обновлений).
Для установки выполните следующие действия:
# Import the public repository GPG keys curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add - # Register the Microsoft Ubuntu repository curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list | sudo tee /etc/apt/sources.list.d/microsoft.list # Update apt-get sudo apt-get update # Install PowerShell sudo apt-get install -y powershell # Start PowerShell powershell
После регистрации репозитория Microsoft один раз в качестве суперпользователя, с этого момента вам просто нужно использовать sudo apt-get upgrade powershell
update sudo apt-get upgrade powershell
для его обновления. Затем просто запустите powershell
Разрешить скрипты, хранящиеся на вашем компьютере, запускать незаписанные
По соображениям безопасности PowerShell по умолчанию настроен только на то, чтобы разрешить выполнение скриптов. Выполнение следующей команды позволит вам запускать неподписанные скрипты (для этого необходимо запустить PowerShell в качестве администратора).
Set-ExecutionPolicy RemoteSigned
Другой способ запускать сценарии PowerShell - использовать Bypass
как ExecutionPolicy
:
powershell.exe -ExecutionPolicy Bypass -File "c:\MyScript.ps1"
Или из существующей консоли PowerShell или сеанса ISE, запустив:
Set-ExecutionPolicy Bypass Process
Временное обходное решение для политики выполнения также может быть достигнуто путем запуска исполняемого файла Powershell и передачи любой допустимой политики в качестве параметра -ExecutionPolicy
. Эта политика действует только во время жизни процесса, поэтому административный доступ к реестру не требуется.
C:\>powershell -ExecutionPolicy RemoteSigned
Существует несколько других политик, и сайты в Интернете часто рекомендуют вам использовать Set-ExecutionPolicy Unrestricted
. Эта политика сохраняется до изменения и снижает уровень безопасности системы. Это не рекомендуется. Рекомендуется использовать RemoteSigned
поскольку он позволяет локально сохраненный и написанный код и требует, чтобы удаленный код был подписан с сертификатом из доверенного корня.
Кроме того, остерегайтесь того, что политика выполнения может быть принудительно применена групповой политикой, так что даже если политика будет изменена на Unrestricted
общесистемную, групповая политика может вернуть эту настройку в следующий интервал ее выполнения (обычно 15 минут). Вы можете увидеть политику выполнения, установленную в различных областях, используя Get-ExecutionPolicy -List
Документация TechNet:
Set-ExecutionPolicy
about_Execution_Policies
Псевдонимы и аналогичные функции
В PowerShell существует много способов добиться того же результата. Это можно хорошо иллюстрировать простым и знакомым примером Hello World
:
Использование Write-Host
:
Write-Host "Hello World"
Использование Write-Output
:
Write-Output 'Hello world'
Стоит отметить, что хотя Write-Output
& Write-Host
и записываются на экран, есть тонкая разница. Write-Host
записывает только в stdout (т. Е. Экран консоли), тогда как Write-Output
записывает как в stdout AND, так и в выходной [success] поток, допускающий перенаправление . Перенаправление (и потоки в целом) позволяют выводить одну команду для ввода в качестве входа в другую, включая присвоение переменной.
> $message = Write-Output "Hello World"
> $message
"Hello World"
Эти подобные функции не являются псевдонимами, но могут давать одинаковые результаты, если вы хотите избежать «загрязнения» потока успеха.
Write-Output
выдается с псевдонимом Echo
или Write
Echo 'Hello world'
Write 'Hello world'
Или просто набрав «Hello world»!
'Hello world'
Все это приведет к ожидаемому выпуску консоли
Hello world
Другим примером псевдонимов в PowerShell является общее сопоставление команд старой команды командной строки и команд BASH командлетам PowerShell. Все следующие производят список каталогов текущего каталога.
C:\Windows> dir
C:\Windows> ls
C:\Windows> Get-ChildItem
Наконец, вы можете создать свой собственный псевдоним с помощью командлета Set-Alias! В качестве примера давайте рассмотрим Test-NetConnection
, который по сути является PowerShell, эквивалентным команде ping командной строки, для «ping».
Set-Alias -Name ping -Value Test-NetConnection
Теперь вы можете использовать ping
вместо Test-NetConnection
! Имейте в виду, что если псевдоним уже используется, вы перезапишете ассоциацию.
Псевдоним будет жив, пока сессия не будет активна. Как только вы закроете сеанс и попытаетесь запустить псевдоним, который вы создали на своем последнем сеансе, он не будет работать. Чтобы преодолеть эту проблему, вы можете импортировать все свои псевдонимы из Excel в свою сессию один раз, прежде чем начинать свою работу.
Трубопровод - использование вывода командлета PowerShell
Один из первых вопросов, который возникает у людей, когда они начинают использовать PowerShell для скриптинга, - это то, как манипулировать выходом из командлета для выполнения другого действия.
Символ трубопровода |
используется в конце командлета, чтобы взять данные, которые он экспортирует, и передать их следующему командлету. Простым примером является использование Select-Object для отображения свойства Name файла, показанного в Get-ChildItem:
Get-ChildItem | Select-Object Name
#This may be shortened to:
gci | Select Name
Более продвинутое использование конвейера позволяет нам выводить вывод командлета в цикл foreach:
Get-ChildItem | ForEach-Object {
Copy-Item -Path $_.FullName -destination C:\NewDirectory\
}
#This may be shortened to:
gci | % { Copy $_.FullName C:\NewDirectory\ }
Обратите внимание, что в приведенном выше примере используется автоматическая переменная $ _. $ _ - это короткий псевдоним $ PSItem, который является автоматической переменной, которая содержит текущий элемент в конвейере.
Комментирование
Чтобы прокомментировать силовые скрипты, добавив строку, используя символ #
(хэш)
# This is a comment in powershell
Get-ChildItem
Вы также можете иметь многострочные комментарии, используя <#
и #>
в начале и в конце комментария соответственно.
<#
This is a
multi-line
comment
#>
Get-ChildItem
Вызов методов библиотеки .Net
Статические методы библиотеки .Net можно вызывать из PowerShell, инкапсулируя полное имя класса в третью скобку и затем вызывая метод, используя ::
#calling Path.GetFileName()
C:\> [System.IO.Path]::GetFileName('C:\Windows\explorer.exe')
explorer.exe
Статические методы можно вызывать из самого класса, но для вызова нестатических методов требуется экземпляр класса .Net (объект).
Например, метод AddHours не может быть вызван из самого класса System.DateTime. Для этого требуется экземпляр класса:
C:\> [System.DateTime]::AddHours(15)
Method invocation failed because [System.DateTime] does not contain a method named 'AddHours'.
At line:1 char:1
+ [System.DateTime]::AddHours(15)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
В этом случае мы сначала создаем объект , например:
C:\> $Object = [System.DateTime]::Now
Затем мы можем использовать методы этого объекта, даже методы, которые нельзя вызвать непосредственно из класса System.DateTime, например метод AddHours:
C:\> $Object.AddHours(15)
Monday 12 September 2016 01:51:19
Создание объектов
Командлет New-Object
используется для создания объекта.
# Create a DateTime object and stores the object in variable "$var"
$var = New-Object System.DateTime
# calling constructor with parameters
$sr = New-Object System.IO.StreamReader -ArgumentList "file path"
Во многих случаях будет создан новый объект для экспорта данных или передачи его другому командному элементу. Это можно сделать так:
$newObject = New-Object -TypeName PSObject -Property @{
ComputerName = "SERVER1"
Role = "Interface"
Environment = "Production"
}
Существует много способов создания объекта. Следующий метод, вероятно, самый короткий и быстрый способ создания PSCustomObject
:
$newObject = [PSCustomObject]@{
ComputerName = 'SERVER1'
Role = 'Interface'
Environment = 'Production'
}
Если у вас уже есть объект, но вам нужно только одно или два дополнительных свойства, вы можете просто добавить это свойство с помощью Select-Object
:
Get-ChildItem | Select-Object FullName, Name,
@{Name='DateTime'; Expression={Get-Date}},
@{Name='PropertieName'; Expression={'CustomValue'}}
Все объекты могут храниться в переменных или передаваться в конвейер. Вы также можете добавить эти объекты в коллекцию, а затем показать результаты в конце.
Коллекции объектов хорошо работают с Export-CSV (и Import-CSV). Каждая строка CSV - это объект, в каждом столбце - свойство.
Команды форматирования преобразуют объекты в текстовый поток для отображения. Избегайте использования команд Format- * до последнего этапа обработки данных, чтобы поддерживать удобство использования объектов.