Saturday 17 February 2018

Powershell 시작 프로세스 대기 시간 제한 시간 초과


Powershell 시작 프로세스 대기 시간 제한
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
PowerShell에서 프로세스 출력을 비동기 적으로 캡처하는 방법은 무엇입니까?
Powershell 스크립트에서 시작하여 콘솔에 비동기 적으로 표시하는 프로세스에서 stdout 및 stderr를 캡처하려고합니다. MSDN 및 다른 블로그를 통해이 작업을 수행하는 데 필요한 설명서가 있습니다.
아래 예제를 만들고 실행 한 후에는 출력을 비동기 적으로 표시 할 수 없습니다. 모든 출력은 프로세스가 종료 될 때만 표시됩니다.
이 예제에서는 OutputDataReceived 이벤트가 발생했기 때문에 프로그램 실행이 끝나기 전에 명령 줄에서 "hi"의 출력을 보려고합니다.
다른 실행 파일 (java. exe, git. exe 등)을 사용하여이 작업을 시도했습니다. 모두 동일한 효과가 있으므로 이해하지 못하거나 놓친 간단한 것이 있다고 생각합니다. 비동기 적으로 stdout을 읽으려면 다른 작업을 수행해야합니까?
불행히도 비동기식 읽기는 제대로 수행하려는 경우 쉽지 않습니다. 시간 초과없이 WaitForExit ()을 호출하면이 함수와 비슷한 것을 사용할 수 있습니다 (C # 코드 기반).
stdout, stderr 및 exit 코드를 캡처합니다. 사용 예 :
더 많은 정보와 대체 구현체 (C #)는이 블로그 게시물을 읽으십시오.
알렉산더 Obersht의 대답을 기반으로 이벤트 처리기 대신 시간 초과 및 비동기 작업 클래스를 사용하는 함수를 만들었습니다. Mike Adelson에 따르면.
불행하게도이 메소드 (이벤트 핸들러)는 마지막 데이터 비트가 수신 된 시점을 알 수있는 방법이 없습니다. 모든 것이 비동기이기 때문에 WaitForExit ()이 반환 된 후에도 이벤트가 발생하는 것이 가능합니다.
나는이 예제 중 하나를 PS 4.0에서 사용할 수 없었다.
Octopus Deploy 패키지 (Deploy. ps1을 통해)에서 꼭두각시 적용을 실행하고 프로세스가 완료 될 때까지 (1 시간 후) 기다리지 않고 "실시간"출력을보고 싶었 기 때문에 다음을 생각해 냈습니다.
여기의 예제는 모두 유용하지만 내 사용 사례에 완전히 적합하지는 않습니다. 명령을 호출하고 종료하고 싶지 않았습니다. 나는 명령 프롬프트를 열고, 입력을 보내고, 출력을 읽고, 반복하고 싶었다. 여기에 대한 나의 해결책이있다.

Powershell 시작 프로세스 대기 시간 제한
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
Powershell에서 start-process 및 - wait 명령 사용.
나는 Powershell을 처음 사용하고 프로그래밍 배경을 많이 갖고 있지 않으며 단지 소프트웨어 패키지로 사용하려고합니다. 어쨌든 - Wait 매개 변수를 사용하여 start-process 명령에 대해 알아 냈으며 대부분의 경우 잘 작동합니다. 비록 내가 주목 한 것은 당신이 지정한 프로세스를 기다릴뿐만 아니라 메인 프로세스가 더 이상 실행되지 않아도 모든 하위 프로세스를 기다리는 것입니다. 보통 이것은 좋지만 이상한 상황이 있습니다. start-process를 사용하여 복잡한 Oracle 배치 파일을 실행하고 있습니다. 배치 파일은 결국 실제로 기다리고 싶은 setup. exe를 실행하지만 다른 프로세스도 멈추지 않습니다. 따라서 - wait 매개 변수를 사용하면 setup. exe가 더 이상 실행되지 않아도 스크립트가 중지되지 않습니다. 가장 가까운 내가 찾은이 사용하고 있습니다 :
이 작동하지만 시간 초과 명령을 사용하지 않고도 더 좋은 방법이 있다고 생각합니다. 어떤 아이디어?

Powershell 시작 프로세스 대기 시간 제한
Commvault (버전 9 / SP6a)라는 백업 제품을 사용하고 있습니다.
Commvault 명령 "qmedia - b XX2201L4 - el 'Offsite'를 실행 중입니다.
이는 powershell 대화식 프롬프트에서 정상적으로 실행됩니다.
PowerShell 스크립트 파일에 다음을 넣었습니다.
$ exportarg = & quot; - b XX2201L4 - el '오프 사이트'& quot;
시작 프로세스 $ export $ exportarg - wait.
그러나 나는 결코 "done" 내 화면에 표시합니다. 나는 시작 프로세스가 새로운 윈도우를 생성하지만 "qmedia" 명령이 그 일을 끝냈습니다.
이 문제를 어떻게 해결할 수 있습니까?
PSDebug 및 PSBreakpoints를 실행 해보십시오. 설정 방법에 익숙하지 않은 경우 다음 명령을 시도하십시오.
그런 다음 스크립트를 실행하십시오.
실행하면 노란색 출력이 표시되고 (디버그가 켜져 있기 때문에) 2, 3, 4 번 줄에서 멈 춥니 다. 중지되면 변수를 확인하고 프로세스를 확인하여 더 많은 정보를 확인할 수 있습니다 단순히 스크립트가 실행되고 실패하는 것보다 스크립트의 현재 작동에 대해 자세히 설명합니다. 또한 Write-Debug를 사용하여 비슷한 통찰력을 얻을 수 있지만 파이프 라인 개체를 실행 시간으로 볼 수는 없습니다.
마지막으로 표준 오류 및 파일 출력을 작성하여 다른 창에서 실행 중이기 때문에 잡기가되지 않는 것이 있는지 확인해야 할 수 있습니다. 프로세스를 단축하려면 - NoNewWindow 옵션을 사용하십시오. 오류가 발생하거나. exe에서 응답이 있으면 콘솔에 표시되어야합니다.
Yan Li_ 중재자의 답변으로 표시 2012 년 6 월 15 일 금요일 오전 1:48
모든 답장.
나는 이제 "qmedia"에 대한 전체 경로를 사용하여 시도했다. 그리고 같은 일이 일어난다!
몇 가지 질문과 제안 :
qmedia에 대한 완전한 경로를 제공하는 것 외에도 - filepath 및 - argumentlist 매개 변수 이름을 포함하는 것이 좋습니다. 전달할 매개 변수를 받고 있는지 확인할 수 있습니까? powershell 프롬프트에서 명령을 실행할 수 있다고 해봅시다. 시작 프로세스 및 리터럴 매개 변수를 사용하여 프롬프트에서 실행하면 어떻게됩니까? 당신이 그만두면 어떻게 될까? - 창문은 결국 닫힐까요? qmedia 명령을 스크립트에 넣으면 (즉, 시작 프로세스를 사용하지 않고 시작 프로세스가 열리고 닫히지 않는 것은 무엇입니까?
qmedia가 start-process를 사용하지 않고 powershell 스크립트에서 OK를 실행하지만 - wait 기능으로 인해 시작 프로세스가 필요한 경우 기본 스크립트는 start-process를 사용하여 powershell을 시작하여 qmedia 명령 만 포함하는 스크립트를 실행할 수 있습니다 .
PSDebug 및 PSBreakpoints를 실행 해보십시오. 설정 방법에 익숙하지 않은 경우 다음 명령을 시도하십시오.
그런 다음 스크립트를 실행하십시오.
실행하면 노란색 출력이 표시되고 (디버그가 켜져 있기 때문에) 2, 3, 4 번 줄에서 멈 춥니 다. 중지되면 변수를 확인하고 프로세스를 확인하여 더 많은 정보를 확인할 수 있습니다 단순히 스크립트가 실행되고 실패하는 것보다 스크립트의 현재 작동에 대해 자세히 설명합니다. 또한 Write-Debug를 사용하여 비슷한 통찰력을 얻을 수 있지만 파이프 라인 개체를 실행 시간으로 볼 수는 없습니다.
마지막으로 표준 오류 및 파일 출력을 작성하여 다른 창에서 실행 중이기 때문에 잡기가되지 않는 것이 있는지 확인해야 할 수 있습니다. 프로세스를 단축하려면 - NoNewWindow 옵션을 사용하십시오. 오류가 발생하거나. exe에서 응답이 있으면 콘솔에 표시되어야합니다.
Yan Li_ 중재자의 답변으로 표시 2012 년 6 월 15 일 금요일 오전 1:48
비슷한 문제가 있습니다. 내가 dism (전체 경로, 인수 목록, 대기 및 nonwwindow)와 함께 시작 프로세스를 않습니다. 내 스크립트가 처음으로이 cmdlet을 실행하면 결코 완료되지 않습니다. 나는 첫 번째 호출 (/ mount-wim을 수행)을 간단한 & amp; & quot; 달리면 작동합니다.
시작 프로세스가 심각한 프로세스 기능을 겪고있는 것처럼 보입니다.
PS C : \ OPK & gt; get-host.
나는 가상 박스 윈도우 7 전문가, 업데이트 된 PowerShell을 v3.0으로 돌리고있다.
P .: PowerShell 3.0에는 오프라인 도움말에 문제가 있습니다 (관리자가 제대로 작동하지 않으므로 업데이트 도움말)
Adobe Flash CS 5.5를 배치 할 때이 문제가 발생했습니다. 문제는 분명히, 전체 프로세스 그룹이 끝나기를 기다리는 것입니다. Flash의 경우 Flash 프로세스가 종료 될 때 종료되지 않는 Adobe CS5 Extension Manager가 생성됩니다. Extension Manager를 죽인 경우 시작 프로세스가 반환됩니다.
나는이 문제를 우회하는 두 가지 방법을 시도했다.
new-object System. Diagnostic. Process 등을 사용하여 프로세스 객체를 만들 수 있습니다 (웹은이를 수행하는 방법에 대한 충분한 예제를 제공해야합니다).
또는, 훨씬 간단한 방법.
-wait 대신에 start-process - passthru를 사용하고 반환 된 프로세스를 변수에 저장하고 WaitForExit ()을 사용한다.
희망이 누구도 도움이됩니다.
UWinkelmann 편집자 Friday, November 15, 2013 2:48 PM.
Microsoft는 Technet 웹 사이트에 대한 귀하의 의견을 이해하기 위해 온라인 설문 조사를 실시하고 있습니다. 참여를 선택하면 Technet 웹 사이트를 나갈 때 온라인 설문 조사가 제공됩니다.

월터의 통나무.
. 학습하면서 글쓰기.
2011 년 11 월 18 일 금요일.
Process. WaitForExit (Int32) 문제가 발생합니다.
보시다시피, 코드는 "cmd. exe"프로세스를 시작하고 실행하려는 명령을 전달합니다.
코드에서 ping - t 8.8.8.8 명령을 사용했습니다. - t 옵션으로 인해 호스트를 멈추지 않고 ping합니다. 무슨 일이야? ping - t 명령과 함께 "cmd. exe"프로세스는 절대로 종료되지 않고 stdout 스트림을 닫지 않으므로 코드가 Output = process. StandardOutput. ReadToEnd (); 왜냐하면 모든 스트림을 읽는 데 성공하지 못하기 때문입니다.
배치 파일의 명령이 어떤 이유로 든 중단되고 위의 코드가 계속해서 몇 년 동안 작동 한 다음 명백한 이유없이 갑자기 멈추는 경우에도 마찬가지입니다.
"cmd. exe"에 첨부하는 명령이나 호출중인 프로세스가 표준 출력이나 표준 오류를 채우면 교착 상태가 발생할 수 있습니다. 이것은 코드가 라인에 도달 할 수 없기 때문입니다.
실제로 우리 프로그램이 스트림의 채워진 버퍼를 읽지 않는다면 자식 프로세스 (ping 명령이나 배치 파일 또는 실행중인 모든 프로세스)를 실행할 수 없습니다. 코드가 프로세스가있는 줄에 매달려 있습니다. WaitForExit () : 자식 프로젝트가 종료 될 때까지 기다립니다.
두 스트림의 기본 크기는 4096 바이트입니다. 다음 배치 파일을 사용하여이 두 가지 크기를 테스트 할 수 있습니다.

No comments:

Post a Comment