Windows PowerShell에서 원격 컴퓨터에 매개 변수 보내기

완료됨

원격 컴퓨터가 해당 변수를 이해할 수 없는 한 Invoke-Command는 스크립트 블록 또는 스크립트 파일에 변수를 포함할 수 없다는 것을 이미 배웠습니다. 따라서 시작 컴퓨터에서 원격 컴퓨터로 데이터를 전달하는 방법을 찾는 것이 더 복잡해 보일 수 있습니다. 그러나 Invoke-Command는 실제로 이 작업을 수행하기 위한 특정 메커니즘을 제공합니다.

검토를 위한 다음 명령의 숨겨진 의도는 대상 컴퓨터마다 가장 최근 보안 이벤트 로그 항목 10개의 목록을 표시하는 것입니다. 그러나 이 명령은 의도한 대로 작동하지 않습니다.

$Log = 'Security'
$Quantity = 10
Invoke-Command –Computer ONE,TWO –ScriptBlock {
  Get-EventLog –LogName $Log –Newest $Quantity
}

문제는 $Log$Quantity 변수가 로컬 컴퓨터에만 의미가 있고 해당 값이 원격 컴퓨터로 전송되기 전에 스크립트 블록에 삽입되지 않는다는 것입니다. 따라서 원격 컴퓨터는 무엇을 의미하는지 모릅니다.

이 명령에 대한 올바른 구문은 다음과 같습니다.

$Log = 'Security'
$Quantity = 10
Invoke-Command –Computer ONE,TWO –ScriptBlock {
  Param($x,$y) Get-EventLog –LogName $x –Newest $y
} –ArgumentList $Log,$Quantity

이 구문을 사용하면 지역 변수가 Invoke-CommandArgumentList 매개 변수에 전달됩니다. 스크립트 블록 내에서 Param() 블록이 생성됩니다. 이 블록에는 –ArgumentList 값 목록과 동일한 수의 변수가 포함되며, 이 경우 2개입니다. Param() 블록 내의 변수에 이름을 할당할 수 있습니다. 순서에 따라 ArgumentList 매개 변수에서 데이터를 받습니다. 즉, $Log이(가) ArgumentList에 먼저 나열되었으므로 해당 값은 $x(으)로 전달됩니다. Param() 블록의 첫 번째 항목이기 때문입니다. 그러면 예제에 표시된 것처럼 Param() 블록의 변수를 스크립트 블록 내에서 사용할 수 있습니다.

이 구문은 Windows PowerShell 2.0 이상에서 작동합니다. 그러나 Windows PowerShell 3.0에서 간소화된 대체 방법이 도입되었습니다. $variable 로컬 변수가 있고 원격 컴퓨터에서 실행될 명령에 해당 내용을 포함하려는 경우 다음 구문을 실행하면 됩니다.

Invoke-Command –ScriptBlock { Do-Something $Using:variable } –ComputerName REMOTE

$Using: 접두사는 로컬 및 원격 컴퓨터에서 제대로 처리되므로 $Using:variable은(는) 로컬 변수 $variable의 내용으로 바뀝니다.