15

为什么我要问的是我的程序使用了 3rd 方软件,这些软件有时会留下没有链接回我的程序或 3rd 方进程的孤立进程。随着时间的推移,这些孤儿进程开始累积并消耗大量资源。我想定期杀死它们,但为了让我这样做,我需要确定它们是由我的程序而不是其他程序创建的。我在 Process Explorer 中查看了孤立进程,在查看进程的属性时,我看到了一个名为“当前目录”的字段。孤立进程的当前目录是我的程序的安装目录。这会让我放心,我正在杀死我的程序创建的进程。

由于这些进程是由第 3 方创建的,因此我需要在创建它们后通过在它们上运行 taskkill 或其他方式来杀死它们。有没有办法在批处理文件中使用开箱即用的 windows 命令找出进程的当前工作目录?如果这可以通过 wmic 查询来完成,那将是更可取的,但是在使用 wmic 时我似乎无法找到当前的工作目录。我假设如果 Process Explorer 能够获取此信息,我也应该能够通过一些批处理命令获取它。

4

3 回答 3

13

来自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
 ...

有关更多信息,请参阅文档

于 2014-09-15T17:01:09.583 回答
13

Handle是一个实用程序,它显示有关系统中任何进程的打开句柄的信息。您可以使用它来查看打开文件的程序,或查看程序所有句柄的对象类型和名称。

它基于 GUI 的版本是Process Explorer

handle -p yourProcess.exe  > log.txt

它将在日志文件中列出 yourProcess.exe 的所有句柄,现在使用批处理命令,您可以轻松地从 log.txt 中提取 yourProcess 的“当前工作目录”。

由 barlop 添加

这是从 c:\tinyweb\rrr 运行的进程 c:\tinyweb\tiny.exe 的输出..

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 中使用例如 for /f 或使用第三方脚本语言(如 ruby​​)或使用各种 *nix 样式命令行工具的 Windows 端口进行解析。此行使用此类工具并获取它(显然以下行需要 grep 和 sed,最好是它们的体面版本,例如来自 cygwin)

C:\Users\harvey>handle -p tiny.exe | grep "pid:" -A 3 | sed -n "3p" | grep -o ".:[\]\S*"
C:\tinyweb\rrr
于 2013-12-15T08:15:11.907 回答
-1

以下将起作用,尽管您只需要 " CommandLine"" ExecutablePath" - 而不是两者都需要:

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

它将返回如下内容,显示 PID 1111 的程序正在运行的位置:

"C:\Program Files (x86)\Common Files\MyProgram\Agent\agent.exe"
于 2014-09-09T16:03:54.920 回答