我问的原因是我的程序使用第三方软件,有时会留下孤立进程,这些进程没有链接回我的程序或第三方进程。随着时间的推移,这些孤立进程开始累积并消耗大量资源。我想定期杀死它们,但为了做到这一点,我需要确定它们是由我的程序而不是其他程序创建的。我已在 Process Explorer 中查看了孤立进程,当查看进程的属性时,我看到一个名为“当前目录”的字段。孤立进程的当前目录是我的程序的安装目录。这会让我放心,我正在杀死我的程序创建的进程。
由于这些进程是由第 3 方创建的,因此我需要在创建它们后通过运行 taskkill 或其他方式来终止它们。有没有办法在批处理文件中使用开箱即用的 Windows 命令来找出进程的当前工作目录?如果这可以通过 wmic 查询来完成,那就更好了,但在使用 wmic 时我似乎找不到当前工作目录。我假设如果 Process Explorer 能够获取此信息,我也应该能够通过一些批处理命令获取它。
WDK
的
tlist
来救援!其输出的第二行(“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
...
请参阅文档了解更多信息。
Handle 是一个实用程序,可显示有关系统中任何进程的打开句柄的信息。您可以使用它来查看打开文件的程序,或者查看程序所有句柄的对象类型和名称。
其基于 GUI 的版本是 Process Explorer .
handle -p yourProcess.exe > log.txt
它将在日志文件中列出 yourProcess.exe 的所有句柄,现在使用批处理命令,您可以轻松地从 log.txt 中提取 yourProcess 的“当前工作目录”。
由巴洛普添加
这里是输出.. 进程 c: inyweb iny.exe 从 c: inyweb 运行
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),或使用各种 *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
以下内容将起作用,尽管您只需要“
CommandLine
”或“ExecutablePath
” - 而不是两者:
wmic process where "ProcessID=1111" get CommandLine, ExecutablePath
它将返回类似以下内容,显示 PID 1111 的程序正在运行的位置:
"C:\Program Files (x86)\Common Files\MyProgram\Agent\agent.exe"