为什么我要问的是我的程序使用第三方软件,有时会留下孤立的进程,这些进程没有链接回我的程序或第三方进程。随着时间的推移,这些孤儿进程开始累积并消耗大量资源。我想定期杀掉它们,但为了让我这样做,我需要确定它们是由我的程序而不是其他程序创建的。我查看了Process Explorer中的孤立进程,当查看进程的属性时,我看到一个名为“Current Directory”的字段。孤立进程的当前目录是我的程序的安装目录。这会让我放心,我正在杀死我的程序创建的进程。
由于这些进程是由第三方创建的,因此我需要在创建它们之后通过对它们运行taskkill来杀死它们。有没有办法在批处理文件中使用开箱即用的Windows命令来确定进程的当前工作目录?如果这可以通过最好的wmic查询来完成,但是在使用wmic时我似乎无法找到当前的工作目录。我假设如果Process Explorer能够获取此信息,我应该能够通过一些批处理命令获得它。
答案 0 :(得分:9)
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
...
有关详细信息,请参阅the doc。
答案 1 :(得分:7)
Handle是一个实用程序,它显示有关系统中任何进程的打开句柄的信息。您可以使用它来查看打开文件的程序,或查看程序所有句柄的对象类型和名称。
其基于GUI的版本为Process Explorer。
handle -p yourProcess.exe > log.txt
它将列出日志文件中yourProcess.exe的所有句柄,现在使用批处理命令,您可以从log.txt轻松提取yourProcess的“当前工作目录”。
barlop 添加了
这里是c:\ tinyweb \ rrr 如果你想专门解析它,那么你可以在纯cmd.exe中用它来解析它。 for / f,或使用第三方脚本语言(如ruby),或使用各种* nix样式命令行工具的Windows端口。这一行使用了这些工具并得到它(显然下面的行需要grep和sed,最好是版本好的,例如来自cygwin)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>
C:\Users\harvey>handle -p tiny.exe | grep "pid:" -A 3 | sed -n "3p" | grep -o ".:[\]\S*"
C:\tinyweb\rrr
答案 2 :(得分:2)
以下内容有效,但您只需要“CommandLine
”或“ExecutablePath
” - 不是两者都有:
wmic process where "ProcessID=1111" get CommandLine, ExecutablePath
它将返回如下所示的内容,显示PID 1111的程序正在运行的位置:
"C:\Program Files (x86)\Common Files\MyProgram\Agent\agent.exe"