PowerShell에서 배치 파일을 실행하여 상태 및 표준 출력을 얻습니다.

5567 단어 PowerShell
PowerShell에서 배치 파일을 실행하고 종료 상태를 취한다는 단순한 일을 실행하는데, 의외로 젠장은 빠졌으므로, 더 이상 멈추지 않도록 써 둔다.

명령의 직접 실행이 가장



PowerShell에서 명령을 실행할 때는 start-process 등은 개입하지 않고 직접 실행하는 것이 좋다.

처음 이런 것을 쓰고 있었지만 이것이 전혀 잘 안된다. 아래의 코드에서는 Standard Output 등이 출력되지 않는다. .NET의 Process를 사용하는 방법도 있지만 귀찮기 때문에 직접 실행이 좋다.
function StopOnFailedExecution($exitCode) {
  if ($exitCode -Ne 0) 
  { 
    Write-Host $exitCode
    exit $exitCode 
  }
}

$result=start-process "cmd.exe" "/c .\Test.bat" -Wait -PassThru -NoNewWindow
$stdout=$result.StandardOutput
$stderr=$result.StandardError
Write-Host $stdout
Write-Host $stderr
StopOnFailedExecution($result.ExitCode)
Write-Host "success"
echo Hello!
exit 1

PowerShell ISE는 BOM에 주의



처음에는 Test.bat 의 편집을 PowerShell ISE 에서 실시했지만, 이것이 비극을 낳았다. PowerShell ISE는 파일을 BOM으로 저장하지만 cmd.exe는 BOM을 해석하지 않는 것 같습니다. 다음과 같은 오류가 발생합니다. 해결을 위해서는 VSCode 등
C:\Users\tsushi\Code\spike\PowerShell\TestExit.ps1

C:\Users\tsushi\Code\spike\PowerShell>echo Hello! 
cmd.exe : 'echo' is not recognized as an internal or external command,
At C:\Users\tsushi\Code\spike\PowerShell\TestExit.ps1:8 char:1
+ cmd.exe /c ".\Test.bat"
+ ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: ('echo' is no...ternal command,:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

operable program or batch file.

VScode 등으로 bom이 없으면 작동합니다.

function StopOnFailedExecution {
  if ($LASTEXITCODE) 
  { 
    Write-Host $LASTEXITCode
    exit $LASTEXITCODE 
  }
}
cmd.exe /c ".\Test.bat"
StopOnFailedExecution($result.ExitCode)
Write-Host "success"

Result


> C:\Users\tsushi\Code\spike\PowerShell\TestExit.ps1

C:\Users\tsushi\Code\spike\PowerShell>echo Hello! 
Hello!

C:\Users\tsushi\Code\spike\PowerShell>exit 1 
1

좋은 웹페이지 즐겨찾기