programing

Powershell의 Invoke-Command로 호출된 스크립트 블록의 반환 값을 캡처하는 방법

oldcodes 2023. 11. 5. 14:57
반응형

Powershell의 Invoke-Command로 호출된 스크립트 블록의 반환 값을 캡처하는 방법

Invoke-Command를 사용하여 ScriptBlock의 반환 코드를 캡처하려는 것을 제외하고는 이 질문과 매우 유사합니다(따라서 -FilePath 옵션을 사용할 수 없습니다).제 암호는 이렇습니다.

Invoke-Command -computername $server {\\fileserver\script.cmd $args} -ArgumentList $args
exit $LASTEXITCODE

문제는 Invoke-Command가 script.cmd의 return code를 캡처하지 않아 실패 여부를 알 방법이 없다는 것입니다.script.cmd가 실패했는지 알 수 있어야 합니다.

(원격 서버에서 script.cmd의 반환 코드를 볼 수 있게 해주는) New-PS 세션도 사용하려고 했지만 실제로 실패에 대해 아무것도 할 수 있는 방법을 파워셸 스크립트에 다시 전달할 수 없습니다.

$remotesession = new-pssession -computername localhost
invoke-command -ScriptBlock { cmd /c exit 2} -Session $remotesession
$remotelastexitcode = invoke-command -ScriptBlock { $lastexitcode} -Session $remotesession
$remotelastexitcode # will return 2 in this example
  1. 새 세션을 사용하여 새 세션 만들기
  2. 이 세션에서 스크립트 블록 호출
  3. 이 세션에서 마지막 종료 코드 가져오기
$script = {
    # Call exe and combine all output streams so nothing is missed
    $output = ping badhostname *>&1

    # Save lastexitcode right after call to exe completes
    $exitCode = $LASTEXITCODE

    # Return the output and the exitcode using a hashtable
    New-Object -TypeName PSCustomObject -Property @{Host=$env:computername; Output=$output; ExitCode=$exitCode}
}

# Capture the results from the remote computers
$results = Invoke-Command -ComputerName host1, host2 -ScriptBlock $script

$results | select Host, Output, ExitCode | Format-List

호스트 : HOST1
출력: ping 요청에서 호스트의 잘못된 호스트 이름을 찾을 수 없습니다.이름을 확인하고 다시 시도하십시오.
종료 코드 : 1

호스트 : HOST2
출력: ping 요청에서 호스트의 잘못된 호스트 이름을 찾을 수 없습니다.이름을 확인한 후 다시 시도하십시오.
종료 코드 : 1

저는 최근 이 문제를 해결하기 위해 다른 방법을 사용하고 있습니다.원격 컴퓨터에서 실행되는 스크립트에서 나오는 다양한 출력은 배열입니다.

$result = Invoke-Command -ComputerName SERVER01 -ScriptBlock {
   ping BADHOSTNAME
   $lastexitcode
}

exit $result | Select-Object -Last 1

$result변수에는 ping 출력 메시지의 배열과$lastexitcode. 원격 스크립트에서 종료 코드가 마지막으로 출력되면 구문 분석 없이 전체 결과에서 가져올 수 있습니다.

종료 코드 전에 나머지 출력을 얻는 것은 다음과 같습니다.
$result | Select-Object -First $(result.Count-1)

@jon Z의 대답은 좋지만, 이것은 더 간단합니다.

$remotelastexitcode = invoke-command -computername localhost -ScriptBlock {
    cmd /c exit 2; $lastexitcode}

물론 명령어가 출력을 생성하면 이를 억제하거나 구문 분석하여 종료 코드를 얻어야 하며, 이 경우 @jon Z의 대답이 더 나을 수 있습니다.

사용하는 것이 좋습니다.return대신에exit.

예를 들어,

$result = Invoke-Command -ComputerName SERVER01 -ScriptBlock {
   return "SERVER01"
}

$result

언급URL : https://stackoverflow.com/questions/8549184/how-to-capture-the-return-value-of-a-scriptblock-invoked-with-powershells-invok

반응형