Powershell 시스템 진단 프로세스 시작 waitforexit
Diagnostics. Process] :: Start ($ StartInfo).WaitForExit.
Diagnostics. Process] :: Start ($ StartInfo).WaitForExit.
Vista home x64 powershell 스크립트 사용. 루프에서 프로그램을 시작하고 종료 될 때까지 기다리십시오. 가변 길이 인수와 함께 많은 매개 변수가 있습니다.
hlds. exe - console - insecure - game svencoop4 - port 27025 - noipx - num_edicts 4096 + 로그온 maxplayers 12 + map osprey.
\ hlds. exe - console - insecure - game svencoop4 - port 27025 - noipx - num_edicts 4096 + logplay + maxplayers 12 + map osprey | out-null.
$ StartInfo. Arguments = "-console + map c1a1 - game svencoop4"
OS vista home Premium x64 / sp2.
CPU 및 9150e 쿼드 코어 1.8gz.
마더 보드 acpi x64.
그래픽 카드 nvidia geforce 6150se nforce 430.
사운드 카드 realtek high def audio.
화면 해상도 1440x900.
하드 드라이브 st350062 oas scsi.
인터넷 속도 nvidia nforce 10/100 mbps 이더넷, 무선 802.11 b / g.
Re : Diagnostics. Process] :: Start ($ StartInfo).WaitForExit.
나는 비스타 홈 프리미엄 (놀람!)에 문제가있다. 나는 작동하는 가정용 무선 네트워크에 연결되어있다 : XP를 실행할 수있는 2 대의 컴퓨터.
위의 클래스는 start 메소드가 "exe", "batch" . 또는 "powershelllcmds"로 둘러 쌀 수 있는가? 예 : 외부에서 실행할 수 있습니다.
모두들 안녕. PARALLEL (하나씩)이 아닌 여러 IP 노드 (서버, 라우터)에 대해 명령을 실행하고 싶습니다. 내 사건을 증명해.
매개 변수를 사용하여 프로세스를 시작하는 방법을 파악하려고합니다. 예를 들면 다음과 같이 할 수 있습니다 :: 시작 (& quot; Outlook & quot;) 및 Outlook이 시작됩니다. 나는 원한다.
누구든지 System. Diagnostics. Process를 사용하여 & quot; 포장 & quot; 콘솔 응용 프로그램은 어떤 프로세스에 따라 항상 I / O를 전송하지는 않습니다.
이 메서드를 사용하여 시작된 응용 프로그램을 제어 할 수 싶습니다. 내가 전달할 수있는 ProcessStartInfo를 설정하는 방법에 대한 아이디어.
나는 모든 것을 할 수 있기 때문에 :: Start (& quot ;. & quot;)를 많이 사용한다. Start | 대화 상자가 실행됩니다. PowerShell의 변수 확장과 결합하여 사용할 수도 있습니다.
Powershell 시스템 진단 프로세스 시작 waitforexit
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
-Wait 대신 Start-Process 및 WaitForExit을 사용하여 ExitCode를 얻습니다.
PowerShell에서 프로그램을 실행하고 Exit를 기다린 다음 ExitCode에 액세스 할 수 있지만 많은 행운이 없습니다. 나는 백그라운드에서 계속할 수있는 처리가 필요하기 때문에 Start-Process와 함께 사용하고 싶지 않다.
다음은 간단한 테스트 스크립트입니다.
이 스크립트를 실행하면 메모장이 시작됩니다. 이 작업을 수동으로 닫으면 종료 코드가 인쇄되고 - wait를 사용하지 않고 다시 시작됩니다. 이것이 종료되면 ExitCode가 제공되지 않습니다.
프로그램 시작과 종료를 기다리는 사이에 추가 처리를 수행 할 수 있어야하므로 - Wait을 사용할 수 없습니다. 어떤 방법으로이 작업을 수행 할 수 있으며 여전히이 프로세스에서. ExitCode 속성에 액세스 할 수 있습니까?
네가 할 수있는 두 가지 일은 내가 생각하기에.
System. Diagnostics. Process 개체를 수동으로 만들고 시작 프로세스를 건너 뜁니다. 백그라운드 작업에서 실행 파일을 실행합니다 (비 대화식 프로세스에만 해당).
다음 중 하나를 수행하는 방법은 다음과 같습니다.
여기서 기억해야 할 두 가지가 있습니다. 하나는 - PassThru 인수를 추가하는 것이고 두 가지는 - Wait 인수를 추가하는 것입니다. 이 결함으로 인해 wait 인수를 추가해야합니다. connect. microsoft / PowerShell /feedback/details/520554/start-process-does-not-return-exitcode-property.
이렇게하면 프로세스 객체가 다시 전달되고 해당 객체의 ExitCode 속성을 볼 수 있습니다. 다음은 그 예입니다.
-PassThru 또는 - Wait없이 실행하면 아무 것도 출력하지 않습니다.
위의 마지막 제안을 시도하면서 더 간단한 해결책을 발견했습니다. 내가해야만하는 것은 프로세스 핸들을 캐시하는 것이었다. 내가 그렇게하자마자, $ process. ExitCode가 올바르게 작동했습니다. 프로세스 핸들을 캐시하지 않으면 $ process. ExitCode가 null입니다.
또는 이것을 추가하십시오.
이 코드를 사용하면 System. Diagnostics. Process. Start ()를 직접 사용하여 수행 할 수없는 리디렉션 된 출력 / 오류 스트림을 PowerShell에서 처리하도록 할 수 있습니다.
내 과정이 끝났지 만 '- 기다림'옵션은 나를 막아주는 것처럼 보였다.
나는 Adrian의 솔루션을 시도하고 그것을 작동합니다. 하지만 프로세스 핸들을 가져 오는 부작용에 의존하는 대신 Wait-Process를 사용했습니다.
사용 예제.
나는이 방법으로 그것을 해결했다.
나는 입력, 출력 및 오류 모두를 리디렉션하고 출력 및 오류 스트림에서 읽기를 처리했습니다. 이 솔루션은 Windows 7과 Windows 8 모두 SDK 7 - 8.1에서 작동합니다.
Mark Beers, Rob, stevejay 대답을 고려하여 비동기 스트림 읽기를 사용하여 문제를 해결할 클래스를 만들려고했습니다. 그렇게하면 비동기 프로세스 출력 스트림 읽기와 관련된 버그가 있음을 알았습니다.
당신은 그렇게 할 수 없습니다 :
System. InvalidOperationException이 발생합니다 : StandardOut가 리디렉션되지 않았거나 프로세스가 아직 시작되지 않았습니다.
그런 다음 프로세스가 시작된 후 비동기 출력 읽기를 시작해야합니다.
이렇게하면 출력 스트림이 비동기로 설정되기 전에 데이터를받을 수 있기 때문에 경쟁 조건을 만듭니다.
그렇다면 어떤 사람들은 스트림을 비동기로 설정하기 전에 스트림을 읽어야한다고 말할 수 있습니다. 그러나 같은 문제가 발생합니다. 동기 읽기 사이에 경쟁 조건이 있으며 스트림을 비동기 모드로 설정합니다.
"Process"와 "ProcessStartInfo"가 설계된 실제 방식으로 프로세스의 출력 스트림을 안전하게 비동기 적으로 읽는 방법은 없습니다.
다른 사용자가 제안한 것과 같이 비동기 읽기를 사용하는 것이 좋습니다. 그러나 경쟁 조건으로 인해 정보가 누락 될 수 있음을 알고 있어야합니다.
위의 답변 중 하나도 해당 작업을 수행하지 않습니다.
롭 솔루션이 중단되고 'Mark Byers'솔루션이 폐기 된 예외를 얻습니다. (다른 답변의 "솔루션"을 시도했습니다.)
그래서 나는 또 다른 해결책을 제안하기로 결정했다.
이 코드는 디버깅되어 완벽하게 작동합니다.
이것이 간단하고 더 나은 접근 방법입니다 (우리는 AutoResetEvent가 필요 없습니다) :
나는 같은 문제가 있었지만 그 이유는 다르다. 그러나 Windows 8에서는 발생하지만 Windows 7에서는 발생하지 않습니다. 다음 줄이 문제를 일으킨 것으로 보입니다.
해결책은 UseShellExecute를 비활성화하지 않는 것입니다. 원하지 않는 쉘 팝업 창을 받았지만 특별한 일이 일어나지 않을 때까지 기다리는 프로그램보다 훨씬 낫습니다. 그래서 다음과 같은 해결 방법을 추가했습니다.
이제 나를 귀찮게하는 것은 Windows 8에서 왜 이런 일이 일어나고 있는지입니다.
소개.
현재 허용되는 응답이 작동하지 않고 (예외가 throw 됨) 해결 방법이 너무 많지만 완전한 코드가 없습니다. 이것이 대중적인 질문이기 때문에 많은 사람들의 시간을 낭비하는 것은 분명합니다.
Mark Byers의 대답과 Karol Tyl의 대답을 결합하여 Process. Start 메서드를 사용하는 방법을 기반으로 전체 코드를 작성했습니다.
git 명령을 통해 진행 대화 상자를 만드는 데 사용했습니다. 이것이 내가 그것을 사용한 방법입니다 :
이론적으로 stdout과 stderr를 결합 할 수도 있지만 테스트하지는 않았습니다.
나는 이것이 늙다는 것을 알고 있지만이 전체 페이지를 읽은 후에는 해결할 수있는 코드가 없기 때문에 무하마드 레 한 (Muhammad Rehan)을 시도하지는 않았다. . 그것이 완전히 진실하지 않은 경우 작동하지 않는다고 말할 때 가끔은 잘 작동 할 것입니다. EOF 마크 전에 출력의 길이와 관련이 있다고 생각합니다.
어쨌든, 나를 위해 일한 솔루션은 다른 스레드를 사용하여 StandardOutput 및 StandardError를 읽고 메시지를 작성하는 것이 었습니다.
희망이 사람을 도울 수 있기를 바랍니다, 누가 그렇게 열심히 수 있다고 생각!
내부 타임 아웃과 생성 된 애플리케이션에 의한 StandardOutput 및 StandardError의 사용으로 인해 다른 솔루션 (EM0를 포함하여)은 여전히 내 애플리케이션에 대해 교착 상태입니다. 여기 나를 위해 일한 것입니다 :
편집 : StartInfo의 초기화를 코드 샘플에 추가했습니다.
이 게시물 어쩌면 구식하지만 난 왜 그것이 일반적으로 끊어지는 주된 원인은 redirectStandardoutput에 대한 스택 오버 플로우 때문이거나 redirectStandarderror가있는 경우입니다.
출력 데이터 또는 오류 데이터가 크기 때문에 무한정 지속되는 동안 정지 시간이 발생합니다.
Powershell 시스템 진단 프로세스 시작 waitforexit
프로세스를 시작하고 EventHandlers 및 BeginOutputReadLine을 사용하여 StandardOutput 및 StandardError를 가져 오려고합니다. 나는 그 과정을 시작할 수 있지만 얻는다.
예외 호출 & quot; BeginOutputReadLine & quot; "0"으로 설정된다. 인수 : & quot; 프로세스 스트림에서 동기 및 비동기 작업을 혼합 할 수 없습니다. & quot;
여기 내 발사 기능은 다음과 같습니다.
PowerShell 스레딩 모델을 위반하고 있습니까? 감사!
프로세스를 시작하고 EventHandlers 및 BeginOutputReadLine을 사용하여 StandardOutput 및 StandardError를 가져 오려고합니다. 나는 그 과정을 시작할 수 있지만 얻는다.
예외 호출 & quot; BeginOutputReadLine & quot; "0"으로 설정된다. 인수 : & quot; 프로세스 스트림에서 동기 및 비동기 작업을 혼합 할 수 없습니다. & quot;
오류 메시지는 당신이 잘못하고있는 일을 알려줍니다.
동기식 프로세스에는 기능을 할당 할 수 없습니다. 함수는 대리자가 아니므로 작동하지 않습니다. 이벤트 모델을 사용하거나 비동기 변형을 사용해야합니다.
이것을 모델로 사용하십시오.
Oliver Lipkau 중재자의 답변으로 표시 Wednesday, October 12, 2011 2:32 AM.
모든 답장.
나는 당신이 당신의 코드에 오타가 있다고 생각한다. 나는 당신이 만난 가장 겸손한 사람입니다.
프로세스를 시작하고 EventHandlers 및 BeginOutputReadLine을 사용하여 StandardOutput 및 StandardError를 가져 오려고합니다. 나는 그 과정을 시작할 수 있지만 얻는다.
예외 호출 & quot; BeginOutputReadLine & quot; "0"으로 설정된다. 인수 : & quot; 프로세스 스트림에서 동기 및 비동기 작업을 혼합 할 수 없습니다. & quot;
오류 메시지는 당신이 잘못하고있는 일을 알려줍니다.
동기식 프로세스에는 기능을 할당 할 수 없습니다. 함수는 대리자가 아니므로 작동하지 않습니다. 이벤트 모델을 사용하거나 비동기 변형을 사용해야합니다.
이것을 모델로 사용하십시오.
Oliver Lipkau 중재자의 답변으로 표시 Wednesday, October 12, 2011 2:32 AM.
좋아, 내가 BeginOutputReadline의 구현을 오해. 나는 이것을 사용할 수있을 것이라고 생각했다. WaitForExit - 지금 그것을 보았을 때, 나는 왜 그것을 보지 못했다.
VB에서, 나는 이것을 처리하는 스레드를 생성하는 방법을 알고 있고 처리 할 방법이 완성 될 때까지 프로세스를 2) 루프에 넣을 수 있다는 것을 안다.
나는 2 번을하고 싶지 않아. 프로세스가 생성 할 때 주어진 프로세스의 출력을 읽는 다중 스레드 또는 비동기 방법이 있습니까?
좋아, 내가 BeginOutputReadline의 구현을 오해. 나는 이것을 사용할 수있을 것이라고 생각했다. WaitForExit - 지금 그것을 보았을 때, 나는 왜 그것을 보지 못했다.
VB에서, 나는 이것을 처리하는 스레드를 생성하는 방법을 알고 있고 처리 할 방법이 완성 될 때까지 프로세스를 2) 루프에 넣을 수 있다는 것을 안다.
나는 2 번을하고 싶지 않아. 프로세스가 생성 할 때 주어진 프로세스의 출력을 읽는 다중 스레드 또는 비동기 방법이 있습니까?
이벤트 위임자를 만들지 않는 한 실제로는 그렇지 않습니다. 하지만이 PowerShell은 VB가 아닙니다.
여기에서 시작하여 찾고있는 이벤트가 '연결될 수 있는지'확인할 수 있습니다.
도움말 Register-ObjectEvent - full.
편집자 jrv 2011 년 9 월 27 일 화요일 오후 3:22.
표시된 답변은 OP가 고민하고있는 문제, 즉 StdErr 및 StdOut을 리디렉션하는 문제를 해결하지 못하며 여기에서 논의 된 교착 상태 버그로 고통 받고 있습니다.
부모 프로세스가 p. StandardOutput. ReadToEnd 전에 p. WaitForExit를 호출하고 자식 프로세스가 리디렉션 된 스트림을 채우기에 충분한 텍스트를 쓰는 경우 교착 상태가 발생할 수 있습니다. 부모 프로세스는 자식 프로세스가 종료 될 때까지 무기한 대기합니다. 하위 프로세스는 부모가 전체 StandardOutput 스트림에서 읽도록 무기한 대기합니다. & quot;
PowerShell에서이 작업을 만들기위한 최선의 답변을 시도하고 있지만 PowerShell의 System. Diagnostics. Process를 사용하여이 구현에서 교착 상태를 복제하거나 stderr와 stdout를 모두 리디렉션하지는 않습니다.
해결 방법은 다음과 같이 Start-Process cmdlet을 사용합니다.
stdout과 stderr를 텍스트 파일로만 리다이렉션하므로 훌륭한 솔루션은 아닙니다. 하지만 항상 작동하고 stdout과 stderr를 모두 리디렉션합니다.
리디렉션 된 출력을 사용하려는 경우 대기를 사용하지 않습니다. 그것은 NT4 이후의 CreateProcess 디자인입니다.
스트림을 첨부하여 일정한 읽기 및 출력 스트림을 게시하기 때문에 파일을 사용하여 출력을 캡처 할 수 있습니다. 출력 스트림은 결코 중단되지 않습니다. Yu는 코드 루프에서이를 수행 할 수 없습니다. 내가 믿는 스트림 실행 시스템 컨텍스트와 항상 읽을 수있는 기회를 얻을 것이다. 수동 읽기를 할 수 없도록 대기가 스레드에 있습니다. 그것은 명시된 교착 상태입니다.
우리가 프롬프트를 찾고 있기 때문에 콘솔 읽기를 사용하는 것이 일반적입니다. 이 경우 우리는 완성을 기다리지 않을 것입니다. ZTHe 코드는 아마도 'quit'으로 보내질 것이고, 우리는 프로세스가 종료 될 때까지 프로세스를 점검하고 그것에 대해 스핀 할 것입니다.
여기서 문제는 우리가 테드를 출현시킬 수 없다는 것입니다. VB 나 C #, C에서는 IO에 separe thread를 사용하고 기다리는 것에는 separe thread를 사용합니다. 더 나은 아직은 예기치 않게 종료를 동적으로 잡을 수 있기 때문에 나는 세마포어를 사용할 것입니다.
아마도 PowerSHell의 다음 번에 좋은 멀티 스레딩 가능성이있을 것입니다.
이것은 Powershell이 프로그래밍 언어가 아닌 스크립팅 언어이며, 강력한만큼 강력한 함정이 있다는 또 다른 교훈입니다.
Microsoft의 샘플 코드는 powershell 해킹이 여기에서 얻을 수 없다는 것을 깨닫기에 충분하지 않습니다. 이것이 저를 놀라게 한 것입니다. 그리고 OP도 믿습니다. BeginOutputReadline이 마법을 구현하여 일부 블로킹 문제를 해결할 수있는 작업 스레드로 만들었 기 때문에 일부 예외가 있었기 때문입니다. 그렇게하지 않아서 우리는 여기서 끝났습니다.
그리고 약간의 수정을 내 코드에 - 나머지 코드를 작동하는 데 필요한 - 대기 플래그를 중단 :
이것은 Powershell이 프로그래밍 언어가 아닌 스크립팅 언어이며, 강력한만큼 강력한 함정이 있다는 또 다른 교훈입니다.
Microsoft의 샘플 코드는 powershell 해킹이 여기에서 얻을 수 없다는 것을 깨닫기에 충분하지 않습니다. 이것이 저를 놀라게 한 것입니다. 그리고 OP도 믿습니다. BeginOutputReadline이 마법을 구현하여 일부 블로킹 문제를 해결할 수있는 작업 스레드로 만들었 기 때문에 일부 예외가 있었기 때문입니다. 그렇게하지 않아서 우리는 여기서 끝났습니다.
그리고 약간의 수정을 내 코드에 - 나머지 코드를 작동하는 데 필요한 - 대기 플래그를 중단 :
권리. PowerShell은 일반 인구 및 컴파일 언어에서 발생하는 문제를 해소하기 위해 더 안전하게 만들 수 있도록 의도적으로 제한됩니다.
예 - 프로그램이 종료되기 전에 대기 파일이 스풀링을 완료 할 수 있으므로 대기 플래그가 도움이됩니다.
Start-Process는 프로세스 API의 약한 래퍼이지만 파일을 제외한 입력을 리디렉션 할 수 없으므로 의심하지 않는 교착 상태를 보호합니다.
리디렉션 할 필요는 없습니다. 파일을 기다리는 중이고 종료를 쉽게 할 수있는 방법이 필요합니다. API를 사용하면 프로세스 객체를 폴링하거나 출력을 보내서 프로세스가 종료 메시지를 보내고 상태를 기다리는 것을 기다려야합니다.
이것은 관리자 스크립터에게는 너무 많은 일이며, 지적했듯이 문제가 발생하지 않을 것입니다.
안녕 모두, 나는 많은 독서를 하고이 스레드에 넘어져, 나는 비슷한 문제가 있음을 깨달았다. 내 출력을 얻는 데 어려움을 겪고 있으며 ISE 콘솔 창에서 읽도록 오류를 피드합니다. 위에서 작성한 모든 것을 읽은 후에도 MSDN 도움말 위치를 살펴본 후에도 여전히 내 방식으로 오류를 볼 수 없습니다. 비동기 적으로 동시에 동 기적으로 읽을 수는 없으며, 다른 하나보다 먼저 호출하면 교착 상태에 빠질 수 있지만, 출력이 전혀 없기 때문에 오류가있는 곳을 볼 수 없다는 것을 이해합니다. 내 코드는 아래와 같습니다. PowerShell 학습에 대한 훌륭한 자료를 알고 계시다면 저에게 알려주십시오. 조금 더 배우기 위해 사용할 수 있습니다.
기술의 바로 그 학생!
죄송합니다. 그러나이 주제는 5 년간 폐쇄되었습니다. 자신 만의 주제를 시작해야합니다.
안녕 모두, 나는 많은 독서를 하고이 스레드에 넘어져, 나는 비슷한 문제가 있음을 깨달았다. 내 출력을 얻는 데 어려움을 겪고 있으며 ISE 콘솔 창에서 읽도록 오류를 피드합니다. 위에서 작성한 모든 것을 읽은 후에도 MSDN 도움말 위치를 살펴본 후에도 여전히 내 방식으로 오류를 볼 수 없습니다. 비동기 적으로 동시에 동 기적으로 읽을 수는 없으며, 다른 하나보다 먼저 호출하면 교착 상태에 빠질 수 있지만, 출력이 전혀 없기 때문에 내 오류가 어디인지는 여전히 알 수 없습니다. 내 코드는 아래와 같습니다. PowerShell 학습에 대한 훌륭한 자료를 알고 계시다면 저에게 알려주십시오. 조금 더 배우기 위해 사용할 수 있습니다.
기술의 바로 그 학생!
안녕, 해결책 찾았 니? 나는 같은 문제를 가지고있다 :(
Microsoft는 Technet 웹 사이트에 대한 귀하의 의견을 이해하기 위해 온라인 설문 조사를 실시하고 있습니다. 참여를 선택하면 Technet 웹 사이트를 나갈 때 온라인 설문 조사가 제공됩니다.
프로세스를 시작하고 EventHandlers 및 BeginOutputReadLine을 사용하여 StandardOutput 및 StandardError를 가져 오려고합니다. 나는 그 과정을 시작할 수 있지만 얻는다.
예외 호출 & quot; BeginOutputReadLine & quot; "0"으로 설정된다. 인수 : & quot; 프로세스 스트림에서 동기 및 비동기 작업을 혼합 할 수 없습니다. & quot;
여기 내 발사 기능은 다음과 같습니다.
PowerShell 스레딩 모델을 위반하고 있습니까? 감사!
프로세스를 시작하고 EventHandlers 및 BeginOutputReadLine을 사용하여 StandardOutput 및 StandardError를 가져 오려고합니다. 나는 그 과정을 시작할 수 있지만 얻는다.
예외 호출 & quot; BeginOutputReadLine & quot; "0"으로 설정된다. 인수 : & quot; 프로세스 스트림에서 동기 및 비동기 작업을 혼합 할 수 없습니다. & quot;
오류 메시지는 당신이 잘못하고있는 일을 알려줍니다.
동기식 프로세스에는 기능을 할당 할 수 없습니다. 함수는 대리자가 아니므로 작동하지 않습니다. 이벤트 모델을 사용하거나 비동기 변형을 사용해야합니다.
이것을 모델로 사용하십시오.
Oliver Lipkau 중재자의 답변으로 표시 Wednesday, October 12, 2011 2:32 AM.
모든 답장.
나는 당신이 당신의 코드에 오타가 있다고 생각한다. 나는 당신이 만난 가장 겸손한 사람입니다.
프로세스를 시작하고 EventHandlers 및 BeginOutputReadLine을 사용하여 StandardOutput 및 StandardError를 가져 오려고합니다. 나는 그 과정을 시작할 수 있지만 얻는다.
예외 호출 & quot; BeginOutputReadLine & quot; "0"으로 설정된다. 인수 : & quot; 프로세스 스트림에서 동기 및 비동기 작업을 혼합 할 수 없습니다. & quot;
오류 메시지는 당신이 잘못하고있는 일을 알려줍니다.
동기식 프로세스에는 기능을 할당 할 수 없습니다. 함수는 대리자가 아니므로 작동하지 않습니다. 이벤트 모델을 사용하거나 비동기 변형을 사용해야합니다.
이것을 모델로 사용하십시오.
Oliver Lipkau 중재자의 답변으로 표시 Wednesday, October 12, 2011 2:32 AM.
좋아, 내가 BeginOutputReadline의 구현을 오해. 나는 이것을 사용할 수있을 것이라고 생각했다. WaitForExit - 지금 그것을 보았을 때, 나는 왜 그것을 보지 못했다.
VB에서, 나는 이것을 처리하는 스레드를 생성하는 방법을 알고 있고 처리 할 방법이 완성 될 때까지 프로세스를 2) 루프에 넣을 수 있다는 것을 안다.
나는 2 번을하고 싶지 않아. 프로세스가 생성 할 때 주어진 프로세스의 출력을 읽는 다중 스레드 또는 비동기 방법이 있습니까?
좋아, 내가 BeginOutputReadline의 구현을 오해. 나는 이것을 사용할 수있을 것이라고 생각했다. WaitForExit - 지금 그것을 보았을 때, 나는 왜 그것을 보지 못했다.
VB에서, 나는 이것을 처리하는 스레드를 생성하는 방법을 알고 있고 처리 할 방법이 완성 될 때까지 프로세스를 2) 루프에 넣을 수 있다는 것을 안다.
나는 2 번을하고 싶지 않아. 프로세스가 생성 할 때 주어진 프로세스의 출력을 읽는 다중 스레드 또는 비동기 방법이 있습니까?
이벤트 위임자를 만들지 않는 한 실제로는 그렇지 않습니다. 하지만이 PowerShell은 VB가 아닙니다.
여기에서 시작하여 찾고있는 이벤트가 '연결될 수 있는지'확인할 수 있습니다.
도움말 Register-ObjectEvent - full.
편집자 jrv 2011 년 9 월 27 일 화요일 오후 3:22.
표시된 답변은 OP가 고민하고있는 문제, 즉 StdErr 및 StdOut을 리디렉션하는 문제를 해결하지 못하며 여기에서 논의 된 교착 상태 버그로 고통 받고 있습니다.
부모 프로세스가 p. StandardOutput. ReadToEnd 전에 p. WaitForExit를 호출하고 자식 프로세스가 리디렉션 된 스트림을 채우기에 충분한 텍스트를 쓰는 경우 교착 상태가 발생할 수 있습니다. 부모 프로세스는 자식 프로세스가 종료 될 때까지 무기한 대기합니다. 하위 프로세스는 부모가 전체 StandardOutput 스트림에서 읽도록 무기한 대기합니다. & quot;
PowerShell에서이 작업을 만들기위한 최선의 답변을 시도하고 있지만 PowerShell의 System. Diagnostics. Process를 사용하여이 구현에서 교착 상태를 복제하거나 stderr와 stdout를 모두 리디렉션하지는 않습니다.
해결 방법은 다음과 같이 Start-Process cmdlet을 사용합니다.
stdout과 stderr를 텍스트 파일로만 리다이렉션하므로 훌륭한 솔루션은 아닙니다. 하지만 항상 작동하고 stdout과 stderr를 모두 리디렉션합니다.
리디렉션 된 출력을 사용하려는 경우 대기를 사용하지 않습니다. 그것은 NT4 이후의 CreateProcess 디자인입니다.
스트림을 첨부하여 일정한 읽기 및 출력 스트림을 게시하기 때문에 파일을 사용하여 출력을 캡처 할 수 있습니다. 출력 스트림은 결코 중단되지 않습니다. Yu는 코드 루프에서이를 수행 할 수 없습니다. 내가 믿는 스트림 실행 시스템 컨텍스트와 항상 읽을 수있는 기회를 얻을 것이다. 수동 읽기를 할 수 없도록 대기가 스레드에 있습니다. 그것은 명시된 교착 상태입니다.
우리가 프롬프트를 찾고 있기 때문에 콘솔 읽기를 사용하는 것이 일반적입니다. 이 경우 우리는 완성을 기다리지 않을 것입니다. ZTHe 코드는 아마도 'quit'으로 보내질 것이고, 우리는 프로세스가 종료 될 때까지 프로세스를 점검하고 그것에 대해 스핀 할 것입니다.
여기서 문제는 우리가 테드를 출현시킬 수 없다는 것입니다. VB 나 C #, C에서는 IO에 separe thread를 사용하고 기다리는 것에는 separe thread를 사용합니다. 더 나은 아직은 예기치 않게 종료를 동적으로 잡을 수 있기 때문에 나는 세마포어를 사용할 것입니다.
아마도 PowerSHell의 다음 번에 좋은 멀티 스레딩 가능성이있을 것입니다.
이것은 Powershell이 프로그래밍 언어가 아닌 스크립팅 언어이며, 강력한만큼 강력한 함정이 있다는 또 다른 교훈입니다.
Microsoft의 샘플 코드는 powershell 해킹이 여기에서 얻을 수 없다는 것을 깨닫기에 충분하지 않습니다. 이것이 저를 놀라게 한 것입니다. 그리고 OP도 믿습니다. BeginOutputReadline이 마법을 구현하여 일부 블로킹 문제를 해결할 수있는 작업 스레드로 만들었 기 때문에 일부 예외가 있었기 때문입니다. 그렇게하지 않아서 우리는 여기서 끝났습니다.
그리고 약간의 수정을 내 코드에 - 나머지 코드를 작동하는 데 필요한 - 대기 플래그를 중단 :
이것은 Powershell이 프로그래밍 언어가 아닌 스크립팅 언어이며, 강력한만큼 강력한 함정이 있다는 또 다른 교훈입니다.
Microsoft의 샘플 코드는 powershell 해킹이 여기에서 얻을 수 없다는 것을 깨닫기에 충분하지 않습니다. 이것이 저를 놀라게 한 것입니다. 그리고 OP도 믿습니다. BeginOutputReadline이 마법을 구현하여 일부 블로킹 문제를 해결할 수있는 작업 스레드로 만들었 기 때문에 일부 예외가 있었기 때문입니다. 그렇게하지 않아서 우리는 여기서 끝났습니다.
그리고 약간의 수정을 내 코드에 - 나머지 코드를 작동하는 데 필요한 - 대기 플래그를 중단 :
권리. PowerShell은 일반 인구 및 컴파일 언어에서 발생하는 문제를 해소하기 위해 더 안전하게 만들 수 있도록 의도적으로 제한됩니다.
예 - 프로그램이 종료되기 전에 대기 파일이 스풀링을 완료 할 수 있으므로 대기 플래그가 도움이됩니다.
Start-Process는 프로세스 API의 약한 래퍼이지만 파일을 제외한 입력을 리디렉션 할 수 없으므로 의심하지 않는 교착 상태를 보호합니다.
리디렉션 할 필요는 없습니다. 파일을 기다리는 중이고 종료를 쉽게 할 수있는 방법이 필요합니다. API를 사용하면 프로세스 객체를 폴링하거나 출력을 보내서 프로세스가 종료 메시지를 보내고 상태를 기다리는 것을 기다려야합니다.
이것은 관리자 스크립터에게는 너무 많은 일이며, 지적했듯이 문제가 발생하지 않을 것입니다.
안녕 모두, 나는 많은 독서를 하고이 스레드에 넘어져, 나는 비슷한 문제가 있음을 깨달았다. 내 출력을 얻는 데 어려움을 겪고 있으며 ISE 콘솔 창에서 읽도록 오류를 피드합니다. 위에서 작성한 모든 것을 읽은 후에도 MSDN 도움말 위치를 살펴본 후에도 여전히 내 방식으로 오류를 볼 수 없습니다. 비동기 적으로 동시에 동 기적으로 읽을 수는 없으며, 다른 하나보다 먼저 호출하면 교착 상태에 빠질 수 있지만, 출력이 전혀 없기 때문에 오류가있는 곳을 볼 수 없다는 것을 이해합니다. 내 코드는 아래와 같습니다. PowerShell 학습에 대한 훌륭한 자료를 알고 계시다면 저에게 알려주십시오. 조금 더 배우기 위해 사용할 수 있습니다.
기술의 바로 그 학생!
죄송합니다. 그러나이 주제는 5 년간 폐쇄되었습니다. 자신 만의 주제를 시작해야합니다.
안녕 모두, 나는 많은 독서를 하고이 스레드에 넘어져, 나는 비슷한 문제가 있음을 깨달았다. 내 출력을 얻는 데 어려움을 겪고 있으며 ISE 콘솔 창에서 읽도록 오류를 피드합니다. 위에서 작성한 모든 것을 읽은 후에도 MSDN 도움말 위치를 살펴본 후에도 여전히 내 방식으로 오류를 볼 수 없습니다. 비동기 적으로 동시에 동 기적으로 읽을 수는 없으며, 다른 하나보다 먼저 호출하면 교착 상태에 빠질 수 있지만, 출력이 전혀 없기 때문에 내 오류가 어디인지는 여전히 알 수 없습니다. 내 코드는 아래와 같습니다. PowerShell 학습에 대한 훌륭한 자료를 알고 계시다면 저에게 알려주십시오. 조금 더 배우기 위해 사용할 수 있습니다.
기술의 바로 그 학생!
안녕, 해결책 찾았 니? 나는 같은 문제를 가지고있다 :(
Microsoft는 Technet 웹 사이트에 대한 귀하의 의견을 이해하기 위해 온라인 설문 조사를 실시하고 있습니다. 참여를 선택하면 Technet 웹 사이트를 나갈 때 온라인 설문 조사가 제공됩니다.
Comments
Post a Comment