Определить PID исполняемого пакетного файла в Powershell

Мне нужно идентифицировать идентификатор P (rocess) исполняемого командного файла из PowerShell (v1.0) script. Может ли кто-нибудь предложить способ сделать это?

Спасибо, MagicAndi.

3 ответа

Хорошо, зависит ли это от того, как вы выполнили командный файл.

В общем, единственный способ найти это - посмотреть на командную строку, используемую для запуска партии. Если вы дважды щелкните командный файл в проводнике 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 script вы можете проверить свойство MainwindowTitle и получить PID из процесса, который соответствует заголовку вашего пакета:

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

Я протестировал этот метод и, похоже, работает как там, где вы вызываете пакетный файл, дважды щелкая по нему, либо вызывая его из командной строки.


Я не считаю, что это возможно надежным образом. Сам пакетные файлы не запускают отдельный процесс, а запускаются в экземпляре cmd.exe. Нет данных экспорта из этого конкретного процесса, которые будут достоверно сообщать вам, какой файл выполняется.

Единственное исключение - если экземпляр cmd.exe запущен специально для запуска командного файла. В этом случае он появится в командной строке приложения, и можно будет grep командной строки для пакетного файла. Это не решило бы обычный случай, хотя из нескольких командных файлов, запускаемых из командной строки cmd.exe.

licensed under cc by-sa 3.0 with attribution.