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
- 새 세션을 사용하여 새 세션 만들기
- 이 세션에서 스크립트 블록 호출
- 이 세션에서 마지막 종료 코드 가져오기
$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
'programing' 카테고리의 다른 글
테이블 행에 ng-반복 사용 (0) | 2023.11.05 |
---|---|
사용.사용. (0) | 2023.11.05 |
페이지의 사용자 지정 포스트 루프에 페이지 추가 (0) | 2023.11.05 |
MySQL 커넥터 및 서버 호환성(VERSION.server 파일) (0) | 2023.11.05 |
지정한 열 하나를 제외한 모든 열의 DataFrame 검색 (0) | 2023.11.05 |