it-source

부모보다 오래가는 파워셸에서 배경 작업을 시작하려면 어떻게 해야 합니까?

criticalcode 2023. 11. 7. 20:56
반응형

부모보다 오래가는 파워셸에서 배경 작업을 시작하려면 어떻게 해야 합니까?

다음 코드를 생각해 보십시오.

start-job -scriptblock { sleep 10; cmd /c set > c:\env.txt; }
exit

상위 작업이 종료되면 백그라운드 작업이 중지되므로 cmd.exe에 대한 호출이 발생하지 않습니다.부모가 바로 나가고, 아이가 계속 백그라운드에서 뛰도록 비슷한 코드를 쓰고 싶습니다.

가능하다면 모든 것을 하나의 대본에 담아두고 싶습니다.

시작 프로세스를 사용하는 경우 파워셸 세션을 상위 프로세스로 하는 새 하위 프로세스를 생성합니다.이 작업을 시작하는 powershell parent process를 종료하면 새 프로세스가 분리되어 계속 실행됩니다.그러나 부모의 프로세스 트리를 죽이면 살아남지 못합니다.

Start-Process -FilePath notepad.exe

Powershell은 해당 프로세스 트리 외부에서 독립적인 프로세스를 새로 시작할 수 없습니다.그러나 이 작업은 CreateProcess를 사용하여 윈도우즈에서 수행할 수 있으며 이 기능은 WMI를 통해 노출됩니다. 다행히 파워셸에서 호출할 수 있습니다.

Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList notepad.exe

이렇게 하면 프로세스 트리가 삭제된 경우에도 새 프로세스는 계속 실행됩니다. 새 프로세스에는 파워셸 세션이 상위에 있는 것이 아니라 WMI 호스트 프로세스가 있기 때문입니다.

프로세스를 시작해야 합니다.

start-process powershell -ArgumentList "sleep 10; cmd /c set > c:\env.txt" -WindowStyle hidden

Invoke-Command를 사용하면 백그라운드 작업이 상위 작업에서 삭제된다는 제한을 무시할 수 있습니다.좋은 점은 구문이 시작 작업과 거의 같아서 스크립트 블록을 그대로 유지할 수 있다는 것입니다.

start-job -scriptblock { sleep 10; cmd /c set > c:\env.txt; }

그냥 변했을 겁니다

Invoke-Command -ComputerName . -AsJob -scriptblock { sleep 10; cmd /c set > c:\env.txt; }

부모의 죽음에서 갑자기 살아 남습니다(probably를 들어 invoke-command는 다른 컴퓨터에서 프로그램을 실행하기에 적합하므로 부모는 절대 중요하지 않습니다).

그렇게 할 수도 있습니다.

$a = start-job -scriptblock { sleep 10; cmd /c set > c:\env.txt; }
Register-ObjectEvent -InputObject $a -EventName StateChanged -SourceIdentifier "finished"
$b = Wait-Event -SourceIdentifier "finished"
exit

스크립트는 스크립트 블록이 끝날 때까지 기다립니다.

언급URL : https://stackoverflow.com/questions/8515359/how-can-i-start-a-background-job-in-powershell-that-outlives-its-parent

반응형