about_Script_Blocks
Краткое описание
Определяет, какой блок скрипта является и как использовать блоки скриптов на языке программирования PowerShell.
Подробное описание
На языке программирования PowerShell блок скрипта представляет собой коллекцию инструкций или выражений, которые можно использовать в качестве одной единицы. Коллекция инструкций может быть заключена в фигурные скобки ({}
), определена как функция или сохранена в файле скрипта. Блок скрипта может возвращать значения и принимать параметры и аргументы.
Синтаксически блок скрипта — это список инструкций в фигурных скобках, как показано в следующем синтаксисе:
{<statement list>}
Блок скрипта возвращает выходные данные всех команд в блоке скрипта как один объект, так и в виде массива.
Можно также указать возвращаемое значение с помощью ключевого return
слова. Ключевое return
слово не влияет на другие выходные данные, возвращаемые из блока скрипта. Однако ключевое return
слово завершает блок скрипта в этой строке. Дополнительные сведения см. в about_Return.
Как и функции, блок скрипта может включать параметры. Используйте ключевое слово Param для назначения именованных параметров, как показано в следующем синтаксисе:
{
Param([type]$Parameter1 [,[type]$Parameter2])
<statement list>
}
Примечание.
В блоке скрипта, в отличие от функции, нельзя указывать параметры за пределами фигурных скобок.
Как и функции, блоки скриптов могут включать DynamicParam
ключевые слова , Begin
Process
а также End
ключевые слова. Дополнительные сведения см. в about_Functions и about_Functions_Advanced.
Использование блоков скриптов
Блок скрипта — это экземпляр типа System.Management.Automation.ScriptBlock
Microsoft платформа .NET Framework. Команды могут иметь значения блочных параметров скрипта. Например, Invoke-Command
командлет имеет ScriptBlock
параметр, который принимает значение блока скрипта, как показано в следующем примере:
Invoke-Command -ScriptBlock { Get-Process }
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
999 28 39100 45020 262 15.88 1844 communicator
721 28 32696 36536 222 20.84 4028 explorer
...
Invoke-Command
также может выполнять блоки скриптов с блоками параметров.
Параметры назначаются по позиции с помощью параметра ArgumentList .
Invoke-Command -ScriptBlock { param($p1, $p2)
"p1: $p1"
"p2: $p2"
} -ArgumentList "First", "Second"
p1: First
p2: Second
Блок скрипта в предыдущем примере использует param
ключевое слово для создания параметров $p1
и $p2
. Строка "First" привязана к первому параметру () и "Second" привязана к ($p1
$p2
).
Дополнительные сведения о поведении ArgumentList см. в about_Splatting.
Переменные можно использовать для хранения и выполнения блоков скриптов. В приведенном ниже примере блок скрипта хранится в переменной и передает его Invoke-Command
в .
$a = { Get-Service BITS }
Invoke-Command -ScriptBlock $a
Status Name DisplayName
------ ---- -----------
Running BITS Background Intelligent Transfer Ser...
Оператор вызова — это другой способ выполнения блоков скриптов, хранящихся в переменной.
Например Invoke-Command
, оператор вызова выполняет блок скрипта в дочерней области. Оператор вызова может упростить использование параметров с блоками скриптов.
$a ={ param($p1, $p2)
"p1: $p1"
"p2: $p2"
}
&$a -p2 "First" -p1 "Second"
p1: Second
p2: First
Выходные данные из блоков скриптов можно хранить в переменной с помощью назначения.
PS> $a = { 1 + 1}
PS> $b = &$a
PS> $b
2
PS> $a = { 1 + 1}
PS> $b = Invoke-Command $a
PS> $b
2
Дополнительные сведения о операторе вызова см. в about_Operators.
Использование блоков скриптов с задержкой привязки с параметрами
Типизированный параметр, принимаюющий входные данные конвейера, позволяет использовать блоки скриптов задержки и привязки к параметру. Для определения параметров конвейерного командлета перед выполнением скрипта можно использовать блоки скриптов с задержкой привязки.
В блоке скриптов с задержкой привязки можно ссылаться на канал в объекте с помощью переменной $_
конвейера.
# Both examples rename config.log to old_config.log
# Without delay-binding
dir config.log | ForEach-Object -Process {
Rename-Item -Path $_ -NewName "old_$($_.Name)"
}
# With delay-binding
dir config.log | Rename-Item -NewName { "old_$($_.Name)" }
В более сложных командлетах блоки скриптов отложенной привязки позволяют повторно использовать один канал в объекте для заполнения других параметров.
Заметки о блоках скриптов задержки привязки в качестве параметров:
Необходимо явно указать все имена параметров, которые используются с блоками скриптов с задержкой привязки.
Параметр не должен быть нетипизован, и тип параметра не может быть
[scriptblock]
или[object]
.При использовании блока скрипта задержки привязки возникает ошибка без ввода входных данных конвейера.
Rename-Item -NewName {$_.Name + ".old"}
Rename-Item : Cannot evaluate parameter 'NewName' because its argument is specified as a script block and there is no input. A script block cannot be evaluated without input. At line:1 char:23 + Rename-Item -NewName {$_.Name + ".old"} + ~~~~~~~~~~~~~~~~~~ + CategoryInfo : MetadataError: (:) [Rename-Item], ParameterBindingException + FullyQualifiedErrorId : ScriptBlockArgumentNoInput, Microsoft.PowerShell.Commands.RenameItemCommand
См. также
PowerShell