문제

PowerShell (v1.0) 스크립트에서 실행 배치 파일의 p (rocess) ID를 식별해야합니다. 누구든지 이것을하는 방법을 제안 할 수 있습니까?

감사합니다, Magicandi.

도움이 되었습니까?

해결책

글쎄, 그것이 가능한지 여부는 배치 파일을 실행하는 방법에 따라 다릅니다.

일반적으로, 당신이 이것을 찾을 수있는 유일한 방법은 배치를 시작하는 데 사용되는 명령 줄을 보는 것입니다. Windows 탐색기에서 배치 파일을 두 번 클릭하면

cmd /c ""C:\Users\Me\test.cmd" "

PowerShell에서는 사용할 수 있습니다 Get-WMIObject ~에 Win32_Process 여기에는 명령 줄 포함 :

PS Home:\> gwmi Win32_Process | ? { $_.commandline -match "test\.cmd" } | ft commandline,processid -auto

commandline                             processid
-----------                             ---------
cmd /c ""C:\Users\Me\test.cmd" "             1028

그러나 명령 프롬프트에서 배치를 직접 시작하면 배치가 실행 중이며 누가 시작했는지 외부에서 알 수있는 방법이 없습니다.

다른 팁

실행중인 배치 파일의 PID를 발견하는 한 가지 방법을 찾았습니다. 배치 파일에서 배치 콘솔 창의 제목을 설정하려면 다음을 식별해야합니다.

...
Title MyBatchWindow
...

PowerShell 스크립트에서 MainWindowTitle 속성을 확인하고 배치 창 제목과 일치하는 프로세스에서 PID를 검색 할 수 있습니다.

$batchProcess = get-process cmd | where-Object {$_.MainWindowTitle -eq "MyBatchWindow"}
$processID = $batchProcess .ID
...

이 방법을 테스트했으며 배치 파일을 두 번 클릭하거나 명령 줄에서 호출하여 배치 파일을 호출하는 곳에서 작동하는 것으로 보입니다.

나는 이것이 믿을만한 방식으로 가능하다고 믿지 않는다. 배치 파일 자체는 별도의 프로세스를 시작하지 않고 대신 CMD.exe 인스턴스 내에서 실행됩니다. 특정 프로세스에서 내보낸 데이터가 없어서 실행중인 파일을 확실하게 알려줍니다.

한 가지 예외는 CMD.exe 인스턴스가 배치 파일을 실행하기 위해 특별히 시작된 경우입니다. 이 경우 응용 프로그램의 명령 줄에 나타나며 배치 파일의 명령 줄을 grep 할 수 있습니다. CMD.EXE 프롬프트 내에서 여러 배치 파일이 실행되는 경우에는 일반적인 경우를 해결하지 못합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top