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

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

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

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

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



답변

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


답변

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


답변

“Wait-process”를 사용하십시오.

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

일이 끝났다


답변

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

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


답변

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

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


답변

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

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

Start-Process <path to exe> -Wait


답변

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

예 :

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