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

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

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


person user972276    schedule 13.12.2013    source источник
comment
Взгляните на taskkill /? в командной строке   -  person rene    schedule 14.12.2013
comment
taskkill, насколько мне известно, не покажет мне текущий рабочий каталог процесса. Я не хочу делать что-то вроде taskkill /fi "IMAGENAME eq explorer.exe". Это не помогает мне определить, был ли процесс создан моей программой.   -  person user972276    schedule 14.12.2013
comment
Как насчет того, чтобы перейти к идентификатору parentprocessID через WMIC   -  person Knuckle-Dragger    schedule 14.12.2013
comment
вы уверены, что имеете в виду рабочий каталог процесса, а не только PATH процесса? я не знаю, что у процессов есть рабочий каталог, хотя, может быть, они есть?   -  person barlop    schedule 14.12.2013
comment
список процессов wmic ‹- может помочь   -  person barlop    schedule 14.12.2013
comment
хотя я не вижу «текущий каталог» в выводе WMIC, как указано в свойствах проводника процесса. Возможно, стоит взглянуть на исходный код Process Hacker (клон проводника процессов с открытым исходным кодом) и посмотреть, как заполняется это поле.   -  person Knuckle-Dragger    schedule 14.12.2013
comment
wmic процесс получить идентификатор процесса, командная строка / формат: список   -  person barlop    schedule 25.12.2013
comment
Вы нашли ответ, который сработал для вас?   -  person Lizz    schedule 25.12.2014
comment
@barlop К сожалению, командная строка не является рабочим каталогом.   -  person Sajuuk    schedule 13.04.2018


Ответы (3)


tlist из WDK спешит на помощь! Вторая строка его вывода («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
 ...

См. документ для больше информации.

person wdscxsj    schedule 15.09.2014

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

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

handle -p yourProcess.exe  > log.txt

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

добавлено barlop

вот результат ... для процесса 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
person Sunny    schedule 15.12.2013
comment
+1! Это часть внутреннего пакета системы, не так ли? Это часть W8? - person TrueY; 20.02.2014
comment
текущий рабочий каталог не экспортируется handle.exe. Есть идеи, почему? - person Lizz; 09.09.2014
comment
Согласен, handle.exe не показывает нужную информацию, плюс для запуска нужны права администратора. - person kriegaex; 08.03.2017
comment
Ручка работает, но я не могу указать нужный PID. В основном приходится анализировать вывод, используя коряво выглядящий командный файл или процесс быстрого узла или что-то в этом роде. - person Dave; 30.03.2017
comment
@Dave см. Мою добавленную заметку ... он показывает PID, и я бы использовал регулярные выражения для синтаксического анализа, а не пакетные для / f. - person barlop; 13.04.2018
comment
@barlop: К сожалению, обычно нельзя предполагать фиксированное расположение рабочего каталога в выводе handle; Лучшее, что вы можете сделать, это проверить все записи на предмет того, являются ли они файлами или папками, и даже в этом случае вы можете получить несколько папок . - person mklement0; 19.07.2019
comment
@ mklement0 вы имеете в виду, если этот exe-файл находится в нескольких каталогах? или вы имеете в виду, что рабочий каталог не зависит от пути к файлу. Я даже не уверен, что означает рабочий каталог, потому что из командной строки можно было бы сделать c:\blah>c:\abc\def.exe, поэтому я предполагаю, что рабочий каталог - это c:\blah .. Таким образом, WD является просто синонимом текущего каталога. Но затем дважды щелкните значок в графическом интерфейсе, что является рабочим каталогом. Это опция в графическом интерфейсе, которая устанавливает% CD%, и если да, то программа даже обращает внимание на% CD% или просто открывает файлы с того места, где она была в последний раз - person barlop; 19.07.2019
comment
@barlop Нет, я имею в виду, что данный процесс может иметь дескрипторы для нескольких открытых каталогов, тогда как у него может быть только один рабочий каталог. Таким образом, учитывая произвольный процесс, как узнать, какой из нескольких открытых каталогов является рабочим? Например, попробуйте handle -p explorer.exe. (Ваш конкретный вариант использования может позволить вам делать предположения, устраняющие эту двусмысленность, но я указываю, что этот метод в целом не является надежным). - person mklement0; 19.07.2019
comment
@ mklement0 Я только что отредактировал свой комментарий, добавив еще несколько вопросов, пока вы размещали свой комментарий - person barlop; 19.07.2019
comment
@barlop: Да, рабочий каталог (он же текущий каталог) не связан с путем к исполняемому файлу, запустившему процесс. Хотя все процессы, включая приложения с графическим интерфейсом пользователя, имеют (единственный) рабочий каталог, как сообщает tlist, это не обязательно означают, что это тот же каталог, который программа представляет пользователю в качестве каталога для работы с / в. File Explorer является примером, потому что его собственный (невидимый) рабочий каталог. равно C:\Windows\System32, но текущий каталог для пользователя - это каталог, показанный в графическом интерфейсе пользователя. - person mklement0; 19.07.2019
comment
@barlop: обратите внимание, что %CD% - это просто конструкция cmd.exe: это псевдопеременная среды, которая отражает рабочий каталог только в командной строке и в пакетных файлах. (Хотя технически вы также можете установить его, это не будет работать должным образом, потому что создает настоящую переменную среды со статическим значением, не имеющим отношения к рабочему каталогу.) - person mklement0; 19.07.2019
comment
@ mklement0 ах да, теперь я помню, что в C # есть возможность при запуске процесса установить рабочий каталог stackoverflow.com/questions/114928/. и чтобы получить его, stackoverflow.com/questions/3375406/. так что да, я вижу, это будет и для приложений с графическим интерфейсом. Спасибо - person barlop; 19.07.2019

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

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

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

"C:\Program Files (x86)\Common Files\MyProgram\Agent\agent.exe"
person Lizz    schedule 09.09.2014
comment
Это просто возвращает путь, по которому находится исполняемый файл, а не его текущий рабочий каталог. - person Dave; 30.03.2017