Thursday 15 March 2018

Powershell waitforexit 예제


Powershell 대기업 사례
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
powershell을 사용하여 프로세스가 종료 될 때까지 기다립니다.
나는 F # (C #과 비슷한)에서 이름으로 프로세스를 얻은 다음, 특정 프로세스를 경로로 필터링하고 종료 할 때까지 기다리는 작은 프로그램을 가졌다.
그러나이 코드는 로컬 컴퓨터에서만 작동합니다. 이제 원격 컴퓨터에서 동일한 기능을 사용하고 싶습니다.
그래서 저는 PowerShell을 선택했습니다 (저는 완전히 새로운 것입니다).
그것의 경로로 프로세스를 필터링하고 powershell에서 한 줄을 사용하여 프로세스가 종료 될 때까지 기다릴 수 있습니까? 그렇지 않다면 더 긴 해결책을 제공 할 수 있습니까?
원격 컴퓨터에서이 줄을 어떻게 실행 시킬지 나는 이미 생각이있다. 내가 필요한 건 그저 마술적인 선일 뿐이야.
편집 : 로컬 컴퓨터에서 원격 컴퓨터에서 실행되는 msdeploy를 사용하여 전달하기 때문에 사실이 줄은 로컬 컴퓨터에서 작동해야합니다.
Powershell을 가지고 노는 시간을 보내고 마침내 내가 원하는 것을 얻었습니다.

Powershell 대기업 사례
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
PowerShell이 ​​다음 명령을 시작하기 전에 각 명령이 끝날 때까지 기다리는 방법?
PowerShell 1.0 스크립트를 사용하여 많은 응용 프로그램을 열 수 있습니다. 첫 번째는 가상 머신이고 나머지는 개발 애플리케이션입니다. 나머지 응용 프로그램을 열기 전에 가상 컴퓨터가 부팅을 끝내기를 원합니다.
bash에서는 "cmd1 & amp; & amp; cmd2"라고 말할 수 있습니다.
이것이 내가 가진 것입니다.
일반적으로 내부 명령의 경우 PowerShell은 다음 명령을 시작하기 전에 대기합니다. 이 규칙의 한 가지 예외는 외부 Windows 하위 시스템 기반 EXE입니다. 첫 번째 트릭은 다음과 같이 Out-Null로 파이프 라인을 보내는 것입니다.
PowerShell은 계속 진행하기 전에 Notepad. exe 프로세스가 종료 될 때까지 대기합니다. 코드를 읽는 것으로부터 잡는 것은 멋지지만 종류는 미묘합니다. - Wait 매개 변수와 함께 Start-Process를 사용할 수도 있습니다.
PowerShell Community Extensions 버전을 사용하는 경우 다음과 같습니다.
PowerShell 2.0의 또 다른 옵션은 백그라운드 작업을 사용하는 것입니다.
Start-Process - Wait을 사용하는 것 외에도, 실행 파일의 출력을 파이핑하면 Powershell이 ​​대기하게됩니다. 필요에 따라 Out-Null, Out-Default, Out-String 또는 Out-String - Stream으로 파이프됩니다. 다음은 다른 출력 옵션에 대한 긴 목록입니다.
당신이 참조한 CMD / Bash 스타일 연산자 (& amp; & amp; & amp; ||)가 그리워요. 우리는 Powershell로 좀 더 장황 해져야 할 것 같습니다.
그냥 "대기 프로세스"를 사용하십시오 :
시작 프로세스 & lt; exe 경로 & gt;를 사용하는 경우 - 아니 새 창 - 잠깐.
-PassThru 옵션을 사용하여 출력을 에코 할 수도 있습니다.
일부 프로그램은 Out-Null에 파이프를 사용하여 출력 스트림을 잘 처리하지 못합니다.
그리고 Start-Process는 인수를 전달하기 위해 - ArgumentList 스위치가 필요합니다. 그렇게 편리하지는 않습니다.
또 다른 접근법이 있습니다.
-NoNewWindow 옵션을 포함하면 오류가 발생합니다. Start-Process :이 명령은 오류로 인해 실행할 수 없습니다 : 액세스가 거부되었습니다.

대기 프로세스.
입력을 더 받아들이 기 전에 하나 이상의 프로세스가 중지 될 때까지 기다리십시오.
대기 프로세스는 로컬 컴퓨터에서 실행중인 프로세스에서만 작동합니다.
메모장 프로세스를 중지하고 다음 명령을 계속 진행하기 전에 프로세스가 중지 될 때까지 기다립니다.
PS C : \ & gt; $ nid = (get-process 메모장).id.
PS C : \ & gt; stop-process - id $ nid.
PS C : \ & gt; wait-process - id $ nid.
PS C : \ & gt; wait-process - name outlook, winword - timeout 30입니다.
Wait-Process cmdlet에 대한 프로세스를 지정하는 세 가지 방법을 보여줍니다.
PS C : \ & gt; $ p = get-process 메모장.
PS C : \ & gt; wait-process - id $ p. id.
"그럼 우리는 무엇을 하나? 아무것도. 어떤 것. 우리가 거기 앉아 있지 않는 한. 우리가 망쳐 버린다면 다시 시작하십시오. 다른 것을 시도하십시오. 우리가 모든 불확실성을 만족할 때까지 기다리면 너무 늦을 수 있습니다. "
Wait-Job - 백그라운드 작업을 기다립니다.
대기 이벤트 - 특정 이벤트가 발생할 때까지 기다립니다.

안녕하세요, Scripting Guy! Hey, Scripting Guy! 블로그.
Windows PowerShell에 대해 자세히 알아보십시오.
PowerShell을 사용하여 다른 프로세스가 종료되는 동안 스크립트를 일시 중지하십시오.
요약 : Windows PowerShell을 사용하여 스크립트를 일시 중지하고 계속 진행하기 전에 다른 프로세스가 종료 될 때까지 기다리는 방법을 설명합니다.
안녕하세요, Scripting Guy! Windows PowerShell을 사용하여 응용 프로그램을 종료하려고 시도했지만 응용 프로그램이 다소 복잡합니다. 하나의 프로세스를 중지하고 두 번째 프로세스를 시작하기 전에 해당 프로세스가 완료 될 때까지 기다려야합니다. Start-Sleep cmdlet을 사용하여 스크립트 실행을 일시 중지하여 다른 프로세스를 완료 할 수 있도록 시도했지만 불행히도 다른 시스템이 다른 시스템보다 빠르기 때문에이 방법이 성공하지 못했습니다. 이 일을 더 잘 수행 할 방법을 찾아 낼 수 있습니까?
Microsoft Scripting Guy의 Ed Wilson입니다. 글쎄요, 나는 스탠포드 대학의 켄트 튼의 예언자 왈츠를 듣고 35,000 피트 (10,850 미터) 높이로 떠 다니고 있는데, 이것은 내 마음 속에 (대학의 전 색소폰 전공자로서) 절대적으로 최고의 재즈 표준 중 하나입니다. 지난 몇 시간 동안 Windows PowerShell을 사용 해왔다. (내 유틸리티 함수를 Windows PowerShell 모듈로 그룹화하고 매니페스트를 만든 다음 Copy-Modules 함수를 사용하여 Windows PowerShell 폴더에 설치하기로 결정했습니다.) 가능한 경우 일회용 스크립트를 작성하는 대신 Windows PowerShell 모듈을 작성하는 데 정말로 투자해야합니다. 노력은 큰 배당금을 지불합니다.
어쨌든, 나는 퍼스트 클래스 (나는 업그레이드 됨)와 함께 괜찮은 작업 테이블에 앉아 있고, 나의 새로운 랩탑은 8 시간 이상을 지내고 여전히 훌륭한 성능을 제공하므로 인생은 좋습니다. 고독은 Windows PowerShell을 탐색하고 재생할 수있는 멋진 시간을 제공합니다. 저는 지금 WMI에서 벗어나도록 강요하고 대신 cmdlet을 조합하는 여러 가지 방법에 초점을 맞추어 서늘한 것을 생각해 낼 수 있는지 알아 봅니다. PowerShell Scripts 게시를위한 두 가지 강력한 트릭을 어제 사용하면서 얻은 경로 트릭에 상당히 만족했습니다.
내가 가지고 놀고 있었던 것들 중 하나는 Wait-Process cmdlet입니다. 스크립트에서 사용될 때 프로세스가 종료 될 때까지 스크립트 실행을 중단시키는 데 가장 유용합니다. 이렇게하면 한 번에 하나씩 여러 프로세스를 종료하는 스크립트를 쉽게 작성할 수 있습니다.
Wait-Process cmdlet이 입력을 허용하는 두 가지 방법이 있습니다. 프로세스 이름 또는 프로세스 ID입니다. 예를 들어 메모장의 인스턴스를 시작한 다음 대기 프로세스를 사용하여 메모장을 닫을 때까지 일시 중지 할 수 있습니다.
메모장 프로세스의 인스턴스가 종료되면 스크립트 (또는 Windows PowerShell 콘솔)에 대한 제어가 반환됩니다. 이것은 메모장의 어떤 사본이 닫히는 지 신경 쓰지 않거나 실행중인 프로세스의 인스턴스가 하나 밖에 없다는 것을 알고있을 때 작동합니다.
이를 수행하는 더 유용한 방법은 프로세스가 시작될 때 프로세스 ID를 캡처하고 Wait-Process cmdlet에 해당 프로세스 ID를 사용하는 것입니다. 이 기술은 Invoke-WmiMethod cmdlet을 사용하며 여기에 표시됩니다.
$ proc = Invoke-WmiMethod - Class win32_process - Name create - ArgumentList "notepad"
대기 프로세스 - $ proc. ProcessId를 찾았습니다.
메모장이 종료 될 때까지 스크립트 처리를 중단하기 위해 필자가 가장 좋아하는 트릭 중 하나 (필자가 가장 좋아하는 Windows PowerShell 트릭) 중 하나가 메모장에서 Out-Null로 파이프됩니다. 그런 다음 본 텍스트 파일의 복사본을 제거합니다. 임시 파일을 처리하는 좋은 방법입니다. 이 기술은 다음 코드와 같습니다.
메모장 $ tmpfile | out-null.
이 & ldquo; trick & rdquo; 그것은 다른 것들을 위해 작동하지 않는다는 것입니다. 예를 들어 프로세스 정보를 HTML 형식으로 작성하고이를 Internet Explorer에 표시하면 Out-Null 트릭은 스크립트를 중지하지 않습니다. 또한 특정 프로세스 ID없이 Internet Explorer를 닫으려고하면 Internet Explorer 인스턴스를 두 번 이상 닫을 수 있습니다. 다음에 오는 코드는 임시 위치에 임시 파일을 만듭니다. 파일 확장명을 HTML로 변경 한 다음 Convertto-HTML cmdlet을 사용하여 Get-Process cmdlet에서 HTML 형식의 데이터를 출력합니다. Out-File cmdlet을 사용하여 HTML 형식의 데이터를 파일에 기록한 다음 Invoke-Item cmdlet을 사용하여 Internet Explorer에서 HTML 파일을 엽니 다. 적어도 내 시스템에서는이 방법으로 HTML 파일이 열립니다. 확장 프로그램과 관련된 기본 프로그램) :
Out-File - FilePath $ tmpFile - 인코딩 ascii - append.
참고 뛰어난 게스트 인 Hey, Scripting Guy! 를 참조하십시오! 블로그 게시물, 프록시 기능 : ConvertTo-HTML cmdlet에 filepath 매개 변수를 추가하는 방법은 Microsoft PowerShell MVP Shay Levy가 작성한 PowerShell 핵심 Cmdlet을 활용하십시오. 프록시 함수를 작성하여 Out-File 호출을 피할 수 있습니다.
Out-Null 트릭은 스크립트를 일시 중지하지 않고 정리를 허용하지 않으며 어쨌든 Internet Explorer의 어떤 버전이나 인스턴스가 죽을지 모르기 때문에 새로운 방법이 필요합니다. 다음은 관련된 단계입니다.
임시 파일 이름을 만듭니다. 파일 확장명을 html로 변경하십시오. 데이터를 ConvertTo-Html cmdlet으로 파이프합니다. ConvertTo-Html에서 Out-File으로 데이터를 파이프하고 HTML 문서를 만듭니다. Invoke-WMIMethod를 사용하여 파일을 열고 반환 값을 저장합니다. Wait-Process cmdlet을 사용하면 스크립트 실행을 일시 중지하고 프로세스가 닫힐 때까지 기다릴 수 있습니다. Remove-Item을 사용하여 임시 파일을 제거하십시오.
GetProcessInfoDisplayHTMLtrackProcessAndRemoveTmpFile. ps1 스크립트는 이러한 단계를 설명합니다.
-ChildPath "Internet Explorer \ iexplore. exe"
Out-File - FilePath $ tmpFile - 인코딩 ascii - append.
$ iepid = Invoke-WmiMethod - Class win32_process - Name create - Argument "$ iepath $ tmpfile"
대기 프로세스 - $ iepid. ProcessId를 찾았습니다.
스크립트에서 가장 먼저하는 일은 임시 파일 이름을 얻는 것입니다. GetTempFileName 메서드는 임시 위치에 임시 파일 이름을 만듭니다. 이러한 파일 이름의 예는 다음과 같습니다.
나는 그 기간에 끈을 쪼개었다. 이것은 파일 이름을 분리하고 파일 확장명을 제거하는 신뢰할 수있는 방법은 아니지만 여기에서 작동합니다. 예를 들어, 파일 이름에 이름에 마침표가 두 개 있으면이 작업은 실패합니다. 임시 파일 이름을 & ldquo;.html & rdquo; 두 개의 마침표가있는 파일 이름으로 끝났습니다. 물론 이것은 완벽하게 허용되는 파일 이름입니다. 여기에서는 HTML 파일 확장명으로 임시 파일 이름을 만드는 다른 방법을 간단히 살펴보고자합니다. Internet Explorer에서 파일에 HTML 파일 확장자가 있어야하거나 그렇지 않으면 페이지가 제대로 렌더링되지 않습니다. 예를 들어,.tmp 파일 확장자를 사용하면 다음 그림과 같이 페이지가 렌더링됩니다.
Join-Path cmdlet을 사용하여 경로를 작성하는 것을 좋아합니다. 이렇게하려면 경로의 경로 (부모 경로) 부분과 자식 경로 (자식 경로) 부분을 제공해야합니다. 나는 단순히 내 서식에서 \ 실행 파일에 국한되지 않는다. 예를 들어 명령의 하위 경로 부분에 추가 디렉토리를 포함 할 수 있습니다. 이 예제에서는 환경 변수를 사용하여 x86 프로그램 파일의 경로를 검색 한 다음 나머지 경로를 Internet Explorer 실행 파일에 추가합니다. 나는 그 명령을 어 기고, 역행을 위해 백틱 ( ') 문자를 사용했다. 나는 보통 이것을하지는 않지만, 페이지에 맞추기 위해 필요하다. 스크립트의이 부분은 다음과 같습니다.
-ChildPath "Internet Explorer \ iexplore. exe"
참고 Hey, Scripting Guy! 에서 코드를 복사 할 때! 블로그, 그것은 backtick 문자 뒤에 외래 문자가 나타날 수 있으며, 보이지 않는 문자가 실제로 코드를 중단합니다. 해결 방법은 코드를 Windows PowerShell ISE에 붙여 넣고 백스키 문자를 사용하여 백틱 문자 뒤에 나오는 보이지 않는 문자를 지우는 것입니다.
이제 Convertto-HTML cmdlet을 사용하여 HTML 페이지를 만듭니다. Out-File cmdlet을 사용하여 HTML 코드를 파일에 씁니다. 이 코드는 다음과 같습니다.
Out-File - FilePath $ tmpFile - 인코딩 ascii - append.
Invoke-WMIMethod cmdlet을 사용하여 Win32_Process WMI 클래스에서 create 메서드를 호출합니다. 새로 생성 된 Internet Explorer 인스턴스의 프로세스 ID를 반환하기 때문에이 방법을 사용합니다. $ iepid라는 변수에 프로세스 ID를 저장합니다. 이 코드는 다음과 같습니다.
$ iepid = Invoke-WmiMethod - Class win32_process - Name create - Argument "$ iepath $ tmpfile"
이제 새로 만든 Internet Explorer 인스턴스가 사라질 때까지 스크립트 실행을 중단합니다. 사라지면 Remove-Item cmdlet을 호출하고 여기에 표시된대로 임시 HTML 파일을 삭제합니다.
대기 프로세스 - $ iepid. ProcessId를 찾았습니다.
스크립트가 만들고 표시하는 HTML 파일은 다음 그림과 같습니다.
SK는 Wait-Process cmdlet을 사용하여 스크립트 실행을 일시 중지하고 프로세스가 끝날 때까지 대기하는 모든 작업을 수행합니다. 나는 더 멋진 Windows PowerShell에 대해 내일 나와 함께 할 것을 권유합니다.
트위터와 페이스 북에서 나를 따라 오라고 초대합니다. 질문이 있으시면 scriptermicrosoft로 저에게 보내거나 공식 Scripting Guys 포럼에 질문을 올리십시오. 내일 봐요. 그때까지, 평화.
Ed Wilson, Microsoft Scripting Guy.
답장 취소.
HSG 블로그의 중요성이 다시 높아진 것처럼 퍼스트 클래스 (그는 업그레이드 됨)가 생겼습니다!
& quot; 지금 WMI에서 벗어나도록 강요합니다 & quot; 이 블로그 기사를 보면, 3을 세면 바로 Invoke-WMI 메서드가 등장한다는 것을 알 수 있습니다 .-)))
음, seiousity로 돌아가서 나는 전체 프로세스 중에 PS를 유지할 수 있다면 powershell을 사용하여 많은 운영 기능을 제어 할 수 있다는 것에 동의합니다. 이는 SK의 문제가 아닌 것일 수 있습니다. PowerShell 밖에서 응용 프로그램을 시작하고 종료 할 때까지 기다리는 것이 복잡해집니다. PS에서 루트 applictaion 프로세스를 생성하지 않았으며 프로세스 이름을 사용할 수없는 경우 PID를 사용하지 않아도됩니다. 실행 중에 애플리케이션이 자체 프로세스를 생성하는 경우 생성 된 새 프로세스의 순서를 따르는 것이 쉽지 않을 수 있으므로 각 애플리케이션을 시작하지 않으면 전체 애플리케이션이 끝날 때까지 기다릴 수 있습니다. 그것의 부분은 별도로.
어쨌든 여러분의 예는 우리가 PS로 만든 프로세스의 워크 플로우를 제어하기 위해 powershell에서 할 수있는 것을 보여줍니다. 여러 애플리케이션을 동시에 제어 할 필요가 없거나 더 많은 계산을 수행해야하는만큼 오래 사용할 수 있습니다. 진행중인 워크 플로를 조정하는 데 도움이되는 백그라운드 작업과 비동기 이벤트를 고려해야 할 때입니다.
나는이 이전의 블로그 기사를 기억한다.
하지만 그 주제가 모두의 사랑이되지는 않을 것입니다 & # 8230; 확실히! & # 8230; 그건 powershell 닌자 물건
Klaus Schulte는 "The Scripting Guy"라는 승무원이 말했다. 그리고 나를 처음으로 옮겼습니다 (실제로는 아니지만 좋았습니다). 또한, WMI에 대해 이야기하지 않고 전체 기사를 작성하지 않았 음을 알았습니다. 🙂 예 (이 예는 확실합니다). 그러나 멋진 점은 Wait-Process cmdlet이 있으며 실제 유형의 문제를 쉽게 해결할 수 있다는 것입니다. 또한 "아무도 이야기하지 않습니다"라는 cmdlet 중 하나입니다. 그 문제를 바로 잡는 데 도움이되고 싶었습니다. 귀하의 의견 Klaus에 감사드립니다. 나는 그들을 매일 아침 🙂 찾아 본다.
다른 곳에서 생성 된 프로세스에 의존하는 경우 WMI가 작동합니다. 그러나 자체 스크립트로 생성 된 프로세스 인 경우 시작 프로세스가 작동하지 않는 이유는 무엇입니까? 그것은 당신에게 핸들을 제공하고 다른 작업을 시작하기 전에 완료해야 할 때까지 기다릴 수 있습니다.
또한 생성 된 프로세스의 CPU 사용량을 파악하고 적어도 감시하고 다시 시작하면 다시 시작할 수 있습니다. 저는 24 시간 연중 무휴로 작동해야하는 미디어 인코더를 제어하기 위해이를 사용했으며 수시로 정지하려고했습니다.
왜 시작 - 프로세스; 기본적으로 Start-Process cmdlet은 아무 것도 반환하지 않습니다. Start-Process cmdlet에서 아무 것도 얻으려면 Start-Process - Passthru 옵션을 사용해야합니다. - passthru가 사용되면 실제로 프로세스 ID를 포함하는 diagnostics. process 개체를 반환합니다. 저는 WMI를 사용하지 않는다는 농담을 한 것으로, Invoke-WMIMethod를 사용하여 강화하려고했습니다. 언제나 그렇듯이, PowerShell에는 많은 다양한 방법이 있습니다. 의견을 보내 주셔서 감사 드리며 다른 일을하는 데 도움을 주셔서 감사드립니다.
빠른 질문.
입력 - PSSession에 문제가있어서, 연결이 넘어지기 전에 시간이 걸리며 스크립트가 & quot; 계속 & quot; 그래서 그것은 다음 몇개의 커맨드 라인을 선택하지 않는다. 나는 시작 - 수면과 대기 - 이벤트를 시도했지만 운은 없다.
나는이 서버에 로그인하는 데 사용합니다.
$ secstr = New-Object - TypeName System. Security. SecureString입니다.
$ cred = 새 개체 형식 이름 System. Management. Automation. PSCredential - argumentlist $ username, $ secstr.
$ no91gpotestsrv = New-PSSession - Name no91-gpotestsrv - ComputerName no91-gpotestsrv - Credential $ cred.
(여기서 Enter-PSSession이 멈추지 않고 멈추지 않고 계속됩니다. 여기서 내가 할 수있는 일은 무엇입니까?)
# 네트워크 드라이브 hvor filer ligger를 매핑합니다.
$ net = new-object - ComObject WScriptwork.
# 파일 이름 및 파일 이름 바꾸기.
$ return_fileversion1 = (Get-Command "c : infrontbinstreamingserver_x64.exe").FileVersionInfo. Fileversion.
$ return_fileversion2 = (Get-Command "r : ServersStreamingServerLatestx64streamingserver_x64.exe"). FileVersionInfo. Fileversion.
IF ($ return_fileversion2 - gt $ return_fileversion1)
$ currentdate = get-date - Format yyyyMMdd.
이름 바꾸기 항목 c : tempbinserver_x64.exe - newname (& quot; server_x64.exe & quot; + $ currentdate)
복사본 항목 r : ServersbuildServerLatestx64server_x64.exe c : tempbin.
$ text = & quot; Fileversion + $ return_fileversion2로 복사 한 새 파일 & quot;
ELSEif ($ return_fileversion2 - eq $ return_fileversion1)
쓰기 호스트 & quot; 대상 파일이 소스 파일과 동일 함 & quot;
ELSEif ($ return_fileversion1 - gt $ return_fileversion2)
쓰기 호스트 & quot; 대상 파일이 소스 파일보다 큼 & quot;

No comments:

Post a Comment