about_Remote_Variables

간단한 설명

원격 명령에서 로컬 및 원격 변수를 사용하는 방법을 설명합니다.

자세한 설명

원격 컴퓨터에서 실행하는 명령에서 변수를 사용할 수 있습니다. 변수에 값을 할당한 다음 값 대신 변수를 사용합니다.

기본적으로 원격 명령의 변수는 명령을 실행하는 세션에서 정의되는 것으로 간주됩니다. 로컬 세션에 정의된 변수는 명령에서 지역 변수로 식별되어야 합니다.

원격 변수 사용

PowerShell은 원격 명령에 사용되는 변수가 명령이 실행되는 세션에서 정의되어 있다고 가정합니다.

이 예제에서 $ps 변수는 명령이 실행되는 임시 세션에서 Get-WinEvent 정의됩니다.

Invoke-Command -ComputerName S1 -ScriptBlock {
  $ps = "*PowerShell*"; Get-WinEvent -LogName $ps
}

영구 세션 PSSession에서 명령이 실행되면 해당 세션에서 원격 변수를 정의해야 합니다.

$s = New-PSSession -ComputerName S1
Invoke-Command -Session $s -ScriptBlock {$ps = "*PowerShell*"}
Invoke-Command -Session $s -ScriptBlock {Get-WinEvent -LogName $ps}

지역 변수 사용

원격 명령에서 지역 변수를 사용할 수 있지만 변수는 로컬 세션에서 정의해야 합니다.

PowerShell 3.0부터 범위 한정자를 사용하여 Using 원격 명령에서 지역 변수를 식별할 수 있습니다.

구문 Using 은 다음과 같습니다.

$Using:<VariableName>

다음 예제에서는 변수가 $ps 로컬 세션에서 만들어지지만 명령이 실행되는 세션에서 사용됩니다. Using 범위 한정자는 지역 변수로 식별합니다$ps.

$ps = "*PowerShell*"
Invoke-Command -ComputerName S1 -ScriptBlock {
  Get-WinEvent -LogName $Using:ps
}

Using 범위 한정자는 PSSession에서 사용할 수 있습니다.

$s = New-PSSession -ComputerName S1
$ps = "*PowerShell*"
Invoke-Command -Session $s -ScriptBlock {Get-WinEvent -LogName $Using:ps}

같은 $using:var 변수 참조는 호출자의 컨텍스트에서 변수 $var 값으로 확장됩니다. 호출자의 변수 개체에 액세스할 수 없습니다. Using 범위 한정자는 PSSession 내에서 지역 변수를 수정하는 데 사용할 수 없습니다. 예를 들어 다음 코드는 작동하지 않습니다.

$s = New-PSSession -ComputerName S1
$ps = "*PowerShell*"
Invoke-Command -Session $s -ScriptBlock {$Using:ps = 'Cannot assign new value'}

자세한 Using내용은 about_Scopes 참조 하세요.

스플래팅 사용

PowerShell 스플래팅은 매개 변수 이름 및 값 컬렉션을 명령에 전달합니다. 자세한 내용은 about_Splatting 참조하세요.

이 예제에서 스플래팅 변수 $Splat 는 로컬 컴퓨터에 설정된 해시 테이블입니다. Invoke-Command 원격 컴퓨터 세션에 연결합니다. ScriptBlockAt(@) 기호와 함께 범위 한정자를 사용하여 Using 스플래트된 변수를 나타냅니다.

$Splat = @{ Name = "Win*"; Include = "WinRM" }
Invoke-Command -Session $s -ScriptBlock { Get-Service @Using:Splat }

'Using' 범위 한정자가 필요한 기타 상황

세션 외부에서 실행되는 모든 스크립트 또는 명령의 경우 외부 세션 코드에서 액세스할 수 있도록 호출 세션 범위의 변수 값을 포함하려면 범위 한정자가 필요합니다 Using . Using 범위 한정자는 다음 컨텍스트에서 지원됩니다.

  • ComputerName 또는 Session 매개 변수(원격 세션) 사용으로 Invoke-Command 시작된 원격 실행 명령
  • 백그라운드 작업, 시작( Start-Job Out-of-process 세션)
  • 스레드 작업을 통해 Start-ThreadJob 시작됨(별도의 스레드 세션)

컨텍스트에 따라 포함된 변수 값은 호출자의 범위에 있는 데이터의 독립적인 복사본이거나 해당 데이터에 대한 참조입니다. 원격 및 Out-of-process 세션에서는 항상 독립적인 복사본입니다. 스레드 세션에서는 참조로 전달됩니다.

변수 값의 serialization

원격으로 실행된 명령 및 백그라운드 작업은 out-of-process로 실행됩니다. Out-of-process 세션은 XML 기반 직렬화 및 역직렬화를 사용하여 프로세스 경계를 넘어 변수 값을 사용할 수 있도록 합니다. serialization 프로세스는 개체를 원래 개체 속성을 포함하지만 메서드는 포함하지 않는 PSObject 로 변환합니다.

제한된 형식 집합의 경우 역직렬화는 개체를 원래 형식으로 다시 전송합니다. 리하이딩된 개체는 원래 개체 인스턴스의 복사본입니다. 형식 속성과 메서드가 있습니다. System.Version과 같은 단순 형식의 경우 복사본이 정확합니다. 복합 형식의 경우 복사본이 불완전합니다. 예를 들어 리하이딩된 인증서 개체에는 프라이빗 키가 포함되지 않습니다.

다른 모든 형식의 인스턴스는 PSObject 인스턴스입니다. PSTypeNames 속성에는 역직렬화(예: Deserialized.System.Data.DataTable)가 접두사로 지정된 원래 형식 이름이 포함됩니다.

ArgumentList 매개 변수와 함께 지역 변수 사용

원격 명령에 대한 매개 변수를 정의하고 cmdlet의 Invoke-Command ArgumentList 매개 변수를 사용하여 지역 변수를 매개 변수 값으로 지정하여 원격 명령에서 지역 변수를 사용할 수 있습니다.

  • param 키워드(keyword) 사용하여 원격 명령에 대한 매개 변수를 정의합니다. 매개 변수 이름은 지역 변수의 이름과 일치시킬 필요가 없는 자리 표시자입니다.

  • 명령의 키워드(keyword) 정의된 param 매개 변수를 사용합니다.

  • cmdlet의 ArgumentList 매개 변수를 Invoke-Command 사용하여 지역 변수를 매개 변수 값으로 지정합니다.

예를 들어 다음 명령은 로컬 세션에서 변수를 $ps 정의한 다음 원격 명령에서 사용합니다. 이 명령은 매개 변수 이름 및 지역 변수$ps를 해당 값으로 사용합니다$log.

$ps = "*PowerShell*"
Invoke-Command -ComputerName S1 -ScriptBlock {
  param($log)
  Get-WinEvent -LogName $log
} -ArgumentList $ps

참고 항목