понедельник, 27 февраля 2012 г.

PowerShell: определение в коде скрипта его расположения (каталог, файл, функция)

Покажу, как в скрипте, написанном на PowerShell, можно определить каталог его размещения, имя файла этого скрипта, а так же функцию, в составе которой выполняется текущая строка кода. Так же покажу разницу между аргументами функции и её параметрами.

Параметры функций, фильтров и командлетов имеют имена и не входят в состав переменной $Args. Если при вызове функции/фильтра/командлета явно указывать имена параметров, то неважно, в каком порядке они следуют. Все параметры и аргументы разделяются друг от друга пробелом. Если вместо пробела между некоторыми аргументами ставить запятую, то этот блок аргументов будет воспринят как один аргумент в виде массива.
Пишем два тестовых файла: MyTestFile.ps1 и MyOtherScript.ps1, сохранив их в одном каталоге (это не принципиально - можно и в разных).
MyTestFile.ps1:
# Полное имя выполняемого в данный момент скрипта
$fullName = $MyInvocation.MyCommand.Definition
"Полное имя текущего скрипта: '$fullName'" 
 
# Каталог, в котором размещён файл исполняемого в данный момент скрипта.
$curDir = $MyInvocation.MyCommand.Definition | split-path -parent
"Каталог текущего скрипта: '$curDir'"
 
# Имя файла выполняемого в данный момент скрипта
$name = $MyInvocation.MyCommand.Name
"Имя файла текущего скрипта: '$name'"
 
# Запустим из текущего скрипта др. скрипт и воспользуемся определённой в нём
# функцией
 
# Имя скрипта, который хотим запустить дополнительно
$fileName = "MyOtherScript.ps1"
 
# Выполняем конкатенацию
$script = "$curDir\$fileName"
 
"`n*******`n"
 
"Сейчас запустим скрипт $script..."
 
# Запускаем скрипт
. $script
 
"`nЗапускаем функцию HelloMsg без аргументов:"
HelloMsg
 
"Запускаем функцию HelloMsg с произвольным набором аргументов:"
HelloMsg 1 7 "abc" "def"
 
"`n*******`n"
 
"Разными способами запускаем функцию MyFunction..."
 
MyFunction -First "Первый" -Second "способ"
 
MyFunction -Second "способ" -First "Второй"
 
MyFunction "Третий" "способ"
 
MyFunction "Четвёртый" "способ" "a" "b" "c" "d" $(1..4)
 
MyFunction "Пятый" "способ" "a", "b", "c", "d" $(1..4)

MyOtherScript.ps1 (тот файл, содержимое которого загружается нами в предыдущем коде):
# Сообщаем о начале работы
"Начал выполняться скрипт $($MyInvocation.MyCommand.Definition)..."
 
# Определяем элементарную функцию
function HelloMsg {
    "Привет из функции $($MyInvocation.MyCommand.Name)!"
 
    # Даже если для функции не определено параметров, всегда можно
    # получить доступ к переданным ей аргументам (не путать с параметрами):
    $Args | Write-Host
    "`n"
}
 
# Определяем элементарную функцию
function MyFunction ($First, $Second)  {
    "First = $First`nSecond = $Second"
    # Печатаем все параметры
    $Args | Write-Host
    "`n"
}

Результат работы кода:
Полное имя текущего скрипта: 'C:\test\MyTestFile.ps1'
Каталог текущего скрипта: 'C:\test'
Имя файла текущего скрипта: 'MyTestFile.ps1'
 
*******
 
Сейчас запустим скрипт C:\test\MyOtherScript.ps1...
Начал выполняться скрипт C:\test\MyOtherScript.ps1...
 
Запускаем функцию HelloMsg без аргументов:
Привет из функции HelloMsg!
 
 
Запускаем функцию HelloMsg с произвольным набором аргументов:
Привет из функции HelloMsg!
1
7
abc
def
 
 
 
*******
 
Разными способами запускаем функцию MyFunction...
First = Первый
Second = способ
 
 
First = Второй
Second = способ
 
 
First = Третий
Second = способ
 
 
First = Четвёртый
Second = способ
a
b
c
d
1 2 3 4
 
 
First = Пятый
Second = способ
a b c d
1 2 3 4


Комментариев нет: