다음을 통해 공유


about_Script_Blocks

간단한 설명

스크립트 블록이 무엇인지 정의하고 PowerShell 프로그래밍 언어에서 스크립트 블록을 사용하는 방법을 설명합니다.

자세한 설명

PowerShell 프로그래밍 언어에서 스크립트 블록은 단일 단위로 사용할 수 있는 문 또는 식의 컬렉션입니다. 문 컬렉션은 중괄호(){}로 묶거나, 함수로 정의하거나, 스크립트 파일에 저장할 수 있습니다. 스크립트 블록은 값을 반환하고 매개 변수 및 인수를 수락할 수 있습니다.

구문적으로 스크립트 블록은 다음 구문과 같이 중괄호로 된 문 목록입니다.

{<statement list>}

스크립트 블록은 스크립트 블록에 있는 모든 명령의 출력을 단일 개체 또는 배열로 반환합니다.

키워드를 사용하여 return 반환 값을 지정할 수도 있습니다. 키워드는 return 스크립트 블록에서 반환된 다른 출력에 영향을 주거나 표시하지 않습니다. 그러나 키워드는 return 해당 줄에서 스크립트 블록을 종료합니다. 자세한 내용은 about_Return 참조하세요.

함수와 마찬가지로 스크립트 블록에는 매개 변수가 포함될 수 있습니다. 다음 구문과 같이 Param 키워드를 사용하여 명명된 매개 변수를 할당합니다.

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

참고 항목

스크립트 블록에서는 함수와 달리 중괄호 외부에 매개 변수를 지정할 수 없습니다.

함수와 마찬가지로 스크립트 블록에는 , beginprocessend 키워드가 dynamicparam포함될 수 있습니다. 자세한 내용은 about_Functionsabout_Functions_Advanced 참조하세요.

스크립트 블록 사용

스크립트 블록은 Microsoft .NET Framework 유형의 System.Management.Automation.ScriptBlock인스턴스입니다. 명령에는 스크립트 블록 매개 변수 값이 있을 수 있습니다. 예를 들어 Invoke-Command 이 예제와 같이 cmdlet에는 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"는 첫 번째 매개 변수($p1)에 바인딩되고 "Second"는 ($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 참조하세요.

매개 변수와 함께 지연 바인딩 스크립트 블록 사용

파이프라인 입력을 허용하는 형식화된 매개 변수를 사용하면 매개 변수에서 지연 바인딩 스크립트 블록을 사용할 수 있습니다. 실행하기 전에 지연 바인딩 스크립트 블록을 약식으로 사용하여 파이프라인된 cmdlet에 대한 매개 변수를 정의할 수 있습니다.

지연 바인딩 스크립트 블록 내에서 파이프라인 변수 $_를 사용하여 개체의 파이프를 참조할 수 있습니다.

# 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)" }

더 복잡한 cmdlet에서 지연 바인딩 스크립트 블록을 사용하면 개체에 파이프된 스크립트 블록을 다시 사용하여 다른 매개 변수를 채울 수 있습니다.

매개 변수로 지연 바인딩 스크립트 블록에 대한 참고 사항:

  • 지연 바인딩 스크립트 블록에 사용하는 매개 변수 이름을 명시적으로 지정해야 합니다.

  • 매개 변수를 형식화하지 않아야 하며 매개 변수의 형식은 형식이 될 [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
    

참고 항목