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

StackOverflow https://stackoverflow.com/questions/1342292

Вопрос

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

Спасибо, 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 запускается специально для запуска командного файла.В этом случае он появится в командной строке приложения, и можно будет получить командную строку для командного файла.Однако это не решит обычный случай, когда несколько пакетных файлов запускаются из командной строки cmd.exe.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top