다음 명령을 시작하기 전에 PowerShell에 각 명령이 끝날 때까지 기다리려면 어떻게해야합니까?


212

많은 응용 프로그램을 여는 PowerShell 1.0 스크립트가 있습니다. 첫 번째는 가상 머신이고 다른 하나는 개발 애플리케이션입니다. 나머지 응용 프로그램을 열기 전에 가상 컴퓨터의 부팅을 완료하고 싶습니다.

bash에서 나는 단지 말할 수있다. "cmd1 && cmd2"

이것이 내가 가진 것입니다 ...

C:\Applications\VirtualBox\vboxmanage startvm superdooper
    &"C:\Applications\NetBeans 6.5\bin\netbeans.exe"

답변:


367

일반적으로 내부 명령의 경우 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

2
내 잘못이야. Start-Process -Wait는 훌륭하게 작동하지만 이제는 이것이 내가 찾고있는 것이 아니라는 것을 알았습니다 ... VM이 부팅을 마칠 때까지 실제로 기다리고 있습니다. 힘들 것 같아요. 나는 그것을 위해 새로운 스레드를 찾아야한다고 생각합니다. 고마워
John Mee

7
훌륭 | out-null합니다. 내가 필요한 것을했습니다. 사용하려고 시도 Start-Job했지만 함수의 결과를 매개 변수로 전달하기 때문에 약간 스키 츠 코이 드가 생겨 마지막 제안을 사용할 수 없었습니다 ...
jcolebrand

6
참고로로 여러 개의 인수를 전달해야하는 -ArgumentList경우을 쉼표로 구분하십시오 -ArgumentList /D=test,/S.
sschuberth

1
간단한 "<exe to path> | Out-Null"솔루션에 감사드립니다! "Start-Process <exe의 경로> -NoNewWindow -Wait"방법의 문제점은 상위 프로세스가 상위 프로세스보다 먼저 종료 되더라도 상위 프로세스에서 생성 한 모든 하위 프로세스가 완료 될 때까지 PowerShell이 ​​일시 중지된다는 것입니다. 이로 인해 설치 프로그램 문제가 발생했습니다.
zax

이것은 VM이 Start-AzureRmVM을 시작하기를 기다리는 데 사용합니다. -ResourceGroupName $ ResourceGroupName -Name $ VmName while ((Get-AzureRmVM -ResourceGroupName $ ResourceGroupName -Name $ VmName -Status |`select -ExpandProperty Statuses |`? {$ _.Code -match "PowerState"} |`select -ExpandProperty DisplayStatus) -ne "VM running") {Start-Sleep -s 2} Start-Sleep -s 5 ## VM이 작동 할 수 있도록 VM에 올 시간을줍니다 원격 요청
andrewmo

47

를 사용하는 것 외에도 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 에 대해 더 장황 해야 할 것 같습니다 .


출력을 구문 분석해야하는 경우 엄청나게 좋은 솔루션입니다!
Jan Rothkegel

Out-xxxx 리디렉터 목록을 지적하면 콘솔 출력을 유지해야했기 때문에 Out-Null 대신 Out-Default 를 사용해야하는 이유를 빨리 이해할 수있었습니다 .
Julio Nobre

참고 아무런 추가 작업이 실행하는 데 필요하지 않습니다 콘솔 동 기적으로 응용 프로그램을 - 어떤 쉘에서와 같이, 즉 기본 동작입니다. 파이핑 Out-String 하면 출력단일 멀티 라인 문자열로 변경되지만 PowerShell은 기본적 으로 라인 배열을 반환합니다 . Start-Process콘솔 응용 프로그램의 경우 출력을 캡처하거나 리디렉션 할 수 없으므로 콘솔 에서 실제로 실행하지 않는 한 피해야합니다 .
mklement0

실제로 기본 명령이 동 기적으로 (출력과 함께) 실행되는지 아니면 비동기 적으로 실행되는지는 실행 파일에 따라 다릅니다. 예를 들어, 출력을 캡처하지 않고 다음은 "bingo"만 출력합니다. & 'C : \ Program Files \ Mozilla Firefox \ firefox.exe'-? ; '빙고'
나단 하틀리

12

"Wait-process"를 사용하십시오.

"notepad","calc","wmplayer" | ForEach-Object {Start-Process $_} | Wait-Process ;dir

일이 끝났다


8

당신이 사용하는 경우 Start-Process <path to exe> -NoNewWindow -Wait

-PassThru옵션을 사용하여 출력을 에코 할 수도 있습니다 .


참고 -PassThru하지 않습니다는 에코 출력 (정의에 의해이 아닌 콘솔 응용 프로그램은 콘솔 출력을 생성하지 않습니다), 그것은 출력 System.Diagnostics.Process나중에 종료하는 당신은 그것의 속성과 대기를 조사 할 수 있도록 새로 도입 된 과정을 나타내는 인스턴스를.
mklement0

6

일부 프로그램은 파이프를 사용하여 출력 스트림을 잘 처리하지 못할 수 있습니다 Out-Null.
그리고 편리하지 않은 인수를 전달 Start-Process하는 -ArgumentList스위치가 필요합니다 .
또 다른 접근법이 있습니다.

$exitCode = [Diagnostics.Process]::Start(<process>,<arguments>).WaitForExit(<timeout>)

1
해당 호출에서 여러 인수가 어떻게 작동합니까? 그것들은 어떻게 구분됩니까? 다양한 중첩 문자열 이스케이프 처리 방법은 무엇입니까? 타이!
AnneTheAgile

1
@AnneTheAgile 문서의 사용 공간 문자 이스케이프 사용 백 슬래시를 들어, 인수를 분리하는
ifree

ty @ifree, 나는 그런 식으로 실행하기 위해 testcomplete를 얻었습니다! 공백으로 구분 된 인수 목록 주위에 작은 따옴표를 사용했습니다. [1]; 그러나 이제 $ exitcode = false를 반향하십시오. 프로세스의 리턴 코드가 아닌 것은 무엇입니까? [1] $ exitCode = [Diagnostics.Process] :: Start ( "c : \ Program Files (x86) \ SmartBear \ TestComplete 10 \ Bin \ TestComplete.exe", ' "c : \ Users \ ME \ Documents \ TestComplete 10 프로젝트 \ hig4TestProject1 \ hig4TestProject1.pjs "/ run / project : myProj / test :"KeywordTests | zTdd1_Good "/ exit ') .WaitForExit (60)
AnneTheAgile

3

옵션을 포함하면 -NoNewWindow오류가 발생합니다.Start-Process : This command cannot be executed due to the error: Access is denied.

내가 일할 수있는 유일한 방법은 전화하는 것입니다.

Start-Process <path to exe> -Wait

0

더 나아가면 즉시 파싱 할 수도 있습니다.

예 :

& "my.exe" | %{
    if ($_ -match 'OK')
    { Write-Host $_ -f Green }
    else if ($_ -match 'FAIL|ERROR')
    { Write-Host $_ -f Red }
    else 
    { Write-Host $_ }
}

0

항상 cmd가 있습니다. start-process에 인수를 인용하는 데 문제가 있으면 성 가시지 않을 수 있습니다.

cmd /c start /wait notepad
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.