Функции в PowerShell

Пример

Функция, которая будет перемещать пользователя в определённую директорию

function andrei { set-location "C:\Users\Andrei" }

Если добавить эту функцию в $profile а потом выполнить команду andrei произойдёт переход в домашнюю директорию Andrei

Если в функции используется путь с пробелами, их можно экранировать с помощью символа `

function appbin { set-location C:\Program` Files\App\bin }

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

Конфигурация

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

Его расположение можно узнать командой

$profile

C:\Users\Andrei\Documents\PowerShell\Microsoft.PowerShell_profile.ps1

Если $profile показывает несуществующий путь, то файл с настройками можно создать вручную.

New-Item -Path $profile -Force -ItemType "file"

Затем файл можно открыть и отредактировать в блокноте

notepad $profile

function andrei { set-location "C:\Users\Andrei" }

PowerShell нужно перезапустить.

Запуск определённого .exe файла

Иногда бывает удобно запускать .exe файлы с помощью функций. Особенно, когда путь до них неудобно писать в терминал. Например, они из Program Files (x86)

Пример функции, которая запускает Python которым пользуется TestComplete в интерактивном режиме.

notepad $profile

function tcpython { Start-Process -FilePath "C:\Program Files (x86)\SmartBear\TestComplete 15\x64\Bin\Extensions\Python\Python310\python.exe" }

Параметры

В блоке params можно перечислить параметры функции. Там же можно указать их ожидаемый тип.

# demo.ps1 function test_parameter { param ( [string] $Url, [int]$ Count ) } test_parameter heihei.website 7

Пример с bool

Следующий скрипт может принимать один аргумент типа bool

# demo_bool.ps1 function demo() { param( [bool] $flag ) if ($flag) { Write-Output "Flag" } else { Write-Output "No flag" } } demo demo $false demo 0 demo $true demo 1 demo 2

.\demo_bool.ps1

No flag No flag No flag Flag Flag Flag

$PSBoundParameters

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

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

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

# demo.ps1 function test_parameter { param ( [string]$Url, [int]$Count ) $PSBoundParameters } test_parameter heihei.website 7

.\demo.ps1

Key Value --- ----- Url heihei.website Count 7

С помощью $PSBoundParameters легче разобраться в том как работает передача аргументов в функции и скрипты.

Рассмотрим как игнорируются 'лишние' аргументы.

function test_parameter { param ( [string]$Arg ) $PSBoundParameters } test_parameter A1 B2 C3 D4

.\demo.ps1

Key Value --- ----- Arg A1

function test_parameter { param ( [string]$Arg, [string]$Let ) $PSBoundParameters } test_parameter A1 B2 C3 D4

.\demo.ps1

Key Value --- ----- Arg A1 Let B2

Явно укажем соответствие ключ-значение

function test_parameter { param ( [string]$Arg, [string]$Let ) $PSBoundParameters } test_parameter A1 -Arg B2 -Let C3 D4

.\demo.ps1

Key Value --- ----- Arg B2 Let C3

С помощью $PSBoundParameters можно передавать все аргументы из одной функции в другую.

В этом примере функция Forward передаёт $PSBoundParameters функции Print. $PSBoundParameters отображаются в формате «ключ-значение».

function Print { param($a, $b) # Display the parameters in dictionary format. $PSBoundParameters } function Forward { param($a, $b) # Run the Print function with $a and $b. Print @PSBoundParameters } Forward -a Please -b Print

.\demo.ps1

Key Value --- ----- a Please b Print

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

function Print { param([int]$a, $b) $PSBoundParameters } function Forward { param($a, $b, $c) Print @PSBoundParameters } Forward -a 1 -b Print -c ThisText

.\demo.ps1

Key Value --- ----- a 1 b Print

Полезным свойством $PSBoundParameters является то, что в этом словаре содержатся только локальные аргументы.

Обратите внимание, что при как при явной передаче $a и $b так и при передаче $PSBoundParameters функция Print всё-равно видит $c и $

Явно

function Print { param([int]$a, $b) Write-Host $c $d -f Red $PSBoundParameters } function Forward { param($a, $b, $c, $d) Print $a $b } Forward -a 1 -b Print -c ThisText -d 2

.\demo.ps1

ThisText 2 Key Value --- ----- a 1 b Print

$c и $d доступны, но не попадают в $PSBoundParameters

Тот же самый результат будет если передать аргументы через $PSBoundParameters

function Print { param([int]$a, $b) Write-Host $c $d -f Red $PSBoundParameters } function Forward { param($a, $b, $c, $d) Print @PSBoundParameters } Forward -a 1 -b Print -c ThisText -d 2

.\demo.ps1

ThisText 2 Key Value --- ----- a 1 b Print

Проверить передан ли аргумент

Проверку можно сделать явно

if ($Arg)
if (-not $Arg)

Либо с помощью $PSBoundParameters

function test_parameter { param ( [string]$Url ) # if (-not $Url) if (-not $PSBoundParameters.ContainsKey('Url')) { Write-Output "Parameter 'Url' was not set." } else { Write-Output "Parameter 'Url' is: $Url" } } test_parameter -url aredel.com

.\demo.ps1

Parameter 'Url' is: aredel.com

Если не передавать Url

… test_parameter …

.\demo.ps1

Parameter 'Url' was not set.

Аргументы по умолчанию

function Print { param( [int] $a = 0, [string] $b = "Text" ) Write-Host $a -f Yellow Write-Host $b -f Green $PSBoundParameters } Print -a 1

.\demo.ps1

1 Text Key Value --- ----- a 1

$b не был передан, поэтому получил значение Text

Обратите внимание, на то, что в $PSBoundParameters аргумент $b не попадает.

Автор статьи: Андрей Олегович