Функции в 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 | |
| Скрипты | |
| Циклы |