about_Script_Blocks

Краткое описание

Определяет, какой блок скрипта является и как использовать блоки скриптов на языке программирования PowerShell.

Подробное описание

На языке программирования PowerShell блок скрипта представляет собой коллекцию инструкций или выражений, которые можно использовать в качестве одной единицы. Коллекция инструкций может быть заключена в фигурные скобки ({}), определена как функция или сохранена в файле скрипта. Блок скрипта может возвращать значения и принимать параметры и аргументы.

Синтаксически блок скрипта — это список инструкций в фигурных скобках, как показано в следующем синтаксисе:

{<statement list>}

Блок скрипта возвращает выходные данные всех команд в блоке скрипта как один объект, так и в виде массива.

Можно также указать возвращаемое значение с помощью return ключевое слово. Ключевое слово return не влияет на другие выходные данные, возвращаемые из блока скриптов. return Однако ключевое слово завершает блок скрипта в этой строке. Дополнительные сведения см. в about_Return.

Как и функции, блок скрипта может включать параметры. Используйте ключевое слово Param для назначения именованных параметров, как показано в следующем синтаксисе:

{
    Param([type]$Parameter1 [,[type]$Parameter2])
    <statement list>
}

Примечание.

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

Как и функции, блоки скриптов могут включать DynamicParamBeginProcessEnd и ключевое слово. Дополнительные сведения см. в about_Functions и about_Functions_Advanced.

Использование блоков скриптов

Блок скрипта — это экземпляр типа System.Management.Automation.ScriptBlockMicrosoft платформа .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
    

См. также