Поиск…


замечания

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) и ее необходимо загрузить и установить с этой страницы выпуска .

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

Версии

Версия Включено в 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- * до последнего этапа обработки данных, чтобы поддерживать удобство использования объектов.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow