Функции в PowerShell

Содержание
Пример
$profile: Конфигурация
Запуск определённого .exe файла
Параметры
$PSBoundParameters
Проверить передан ли аргумент
Аргументы по умолчанию
Похожие статьи

Пример

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

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.ru 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.ru 7

.\demo.ps1

Key Value --- ----- Url heihei.ru 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 testsetup.ru

.\demo.ps1

Parameter 'Url' is: testsetup.ru

Если не передавать 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 не попадает.

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

Похожие статьи
param
Скрипты
Циклы

Поиск по сайту

Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых

Перейти на канал

@aofeed

Задать вопрос в Телеграм-группе

@aofeedchat

Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящую по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: