Пакетная команда 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"