답변:
일반적으로 내부 명령의 경우 PowerShell은 다음 명령을 시작하기 전에 대기합니다. 이 규칙의 한 가지 예외는 외부 Windows 하위 시스템 기반 EXE입니다. 첫 번째 요령은 Out-Null
다음과 같이 파이프 라인을 만드는 것입니다.
Notepad.exe | Out-Null
PowerShell은 Notepad.exe 프로세스가 종료 될 때까지 기다렸다가 계속 진행합니다. 그것은 코드를 읽는 것에서 선택하는 것이 좋지만 미묘합니다. Start-Process를 -Wait 매개 변수와 함께 사용할 수도 있습니다.
Start-Process <path to exe> -NoNewWindow -Wait
PowerShell Community Extensions 버전을 사용하는 경우 버전은 다음과 같습니다.
$proc = Start-Process <path to exe> -NoNewWindow -PassThru
$proc.WaitForExit()
PowerShell 2.0의 또 다른 옵션은 백그라운드 작업을 사용하는 것입니다.
$job = Start-Job { invoke command here }
Wait-Job $job
Receive-Job $job
| out-null
합니다. 내가 필요한 것을했습니다. 사용하려고 시도 Start-Job
했지만 함수의 결과를 매개 변수로 전달하기 때문에 약간 스키 츠 코이 드가 생겨 마지막 제안을 사용할 수 없었습니다 ...
-ArgumentList
경우을 쉼표로 구분하십시오 -ArgumentList /D=test,/S
.
를 사용하는 것 외에도 Start-Process -Wait
실행 파일의 출력을 파이핑하면 Powershell이 대기합니다. 필요에 따라, 나는 일반적으로 파이프 것 Out-Null
, Out-Default
, Out-String
또는 Out-String -Stream
. 다음 은 몇 가지 다른 출력 옵션 목록입니다.
# Saving output as a string to a variable.
$output = ping.exe example.com | Out-String
# Filtering the output.
ping stackoverflow.com | where { $_ -match '^reply' }
# Using Start-Process affords the most control.
Start-Process -Wait SomeExecutable.com
참조한 CMD / Bash 스타일 연산자 (&, &&, ||)가 누락되었습니다. 우리는 Powershell 에 대해 더 장황 해야 할 것 같습니다 .
Out-String
하면 출력 이 단일 멀티 라인 문자열로 변경되지만 PowerShell은 기본적 으로 라인 배열을 반환합니다 . Start-Process
콘솔 응용 프로그램의 경우 출력을 캡처하거나 리디렉션 할 수 없으므로 콘솔 창 에서 실제로 실행하지 않는 한 피해야합니다 .
일부 프로그램은 파이프를 사용하여 출력 스트림을 잘 처리하지 못할 수 있습니다 Out-Null
.
그리고 편리하지 않은 인수를 전달 Start-Process
하는 -ArgumentList
스위치가 필요합니다 .
또 다른 접근법이 있습니다.
$exitCode = [Diagnostics.Process]::Start(<process>,<arguments>).WaitForExit(<timeout>)