Пакетная команда windows для определения рабочего каталога процесса

Почему я спрашиваю, что в моей программе используется программное обеспечение сторонних производителей, которое иногда оставляет за бортом процессы, не имеющие обратной связи с моей программой или сторонними процессами. Эти потерянные процессы начинают складываться и со временем потребляют массу ресурсов. Я хотел бы периодически их убивать, но для этого мне нужно знать наверняка, что они были созданы моей программой, а не какой-то другой программой. Я просмотрел потерянные процессы в Process Explorer и, глядя на свойства процесса, я вижу поле с именем "Текущий каталог". Текущий каталог для потерянного процесса - это каталог установки моей программы. Это дало бы мне уверенность, что я убиваю процесс, созданный моей программой.

Поскольку эти процессы создаются сторонними разработчиками, мне нужно просто убить их после того, как они созданы, запустив на них taskkill или что-то в этом роде. Есть ли способ выяснить текущий рабочий каталог процесса, используя готовые команды Windows в командном файле? Если это можно сделать с помощью запросов wmic, это было бы предпочтительным, но я не могу найти текущий рабочий каталог при использовании wmic. Я предполагаю, что если Process Explorer сможет получить эту информацию, я тоже смогу получить ее с помощью некоторых командных команд.

3 ответа

Тлист из WDK на помощь! 2-я строка его вывода ("CWD: ...") показывает рабочий каталог процесса:

> tlist 944
 944 postgres.exe
   CWD:     D:\Lab\Database\pgsql\test\
   CmdLine: "D:/Tools/pgsql/bin/postgres.exe"  -D "."
   VirtualSize:   221116 KB   PeakVirtualSize:   242620 KB
   WorkingSetSize: 17076 KB   PeakWorkingSetSize: 19336 KB
   NumberOfThreads: 4
   9084 Win32StartAddr:0x00000000 LastErr:0x00000000 State:Waiting
   8504 Win32StartAddr:0x00000000 LastErr:0x000000b7 State:Waiting
   8616 Win32StartAddr:0x00000000 LastErr:0x00000000 State:Waiting
   7468 Win32StartAddr:0x00000000 LastErr:0x00000000 State:Waiting
    9.3.5.14202 shp  0x0000000000400000  D:\Tools\pgsql\bin\postgres.exe
 6.1.7601.18247 shp  0x00000000770D0000  C:\Windows\SYSTEM32\ntdll.dll
 ...

Смотрите документ для получения дополнительной информации.

Дескриптор - это утилита, которая отображает информацию об открытых дескрипторах для любого процесса в системе. Вы можете использовать его для просмотра программ, у которых открыт файл, или для просмотра типов объектов и имен всех дескрипторов программы.

Его версия на основе графического интерфейса - Process Explorer.

handle -p yourProcess.exe  > log.txt

В нем будут перечислены все дескрипторы файла yourProcess.exe в файле журнала, и теперь с помощью пакетной команды вы можете легко извлечь "текущий рабочий каталог" вашего процесса из log.txt.

добавлено барлопом

вот вывод.. для процесса c:\tinyweb\tiny.exe, запускаемого из c:\tinyweb\rrr

C:\Users\user>handle -p tiny.exe

Nthandle v4.1 - Handle viewer
Copyright (C) 1997-2016 Mark Russinovich
Sysinternals - www.sysinternals.com

------------------------------------------------------------------------------
tiny.exe pid: 20668 compA\user
   10: File          C:\Windows
   1C: File          C:\tinyweb\rrr
   9C: File          C:\tinyweb\rrr\access_log
   A0: File          C:\tinyweb\rrr\agent_log
   A4: File          C:\tinyweb\rrr\error_log
   A8: File          C:\tinyweb\rrr\referer_log
   E4: Section       \Sessions\1\BaseNamedObjects\__wmhr_msgs_buffer_name$1e74
   EC: File          C:\Windows\winsxs\x86_microsoft.windows.common-controls_659

C:\Users\user>

Если вы хотите разобрать его специально, вы можете сделать это в чистом cmd.exe, например, с / f, или с помощью стороннего языка сценариев, такого как ruby, или с портами Windows различных инструментов командной строки в стиле * nix. Эта строка использует такие инструменты и получает их (очевидно, следующая строка требует grep и sed, желательно приличных версий их, например, из cygwin)

C:\Users\harvey>handle -p tiny.exe | grep "pid:" -A 3 | sed -n "3p" | grep -o ".:[\]\S*"
C:\tinyweb\rrr

Следующее будет работать, хотя вам нужно толькоCommandLine" или "ExecutablePath" - не оба:

wmic process where "ProcessID=1111" get CommandLine, ExecutablePath

Он вернет что-то вроде следующего, показывая, где работает программа для PID 1111:

"C:\Program Files (x86)\Common Files\MyProgram\Agent\agent.exe"
Другие вопросы по тегам