windows批处理命令来确定进程的工作目录

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

由于这些进程是由第三方创build的,我只需要通过在其上运行taskkill创build它们就可以杀死它们。 有没有办法在batch file中使用开箱即用的Windows命令找出进程的当前工作目录? 如果这可以通过wmic查询,这将是可取的,但我似乎无法find当前工作目录,当使用wmic。 我假设如果Process Explorer能够获得这个信息,我应该能够通过一些批处理命令得到它。

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

其基于GUI的版本是Process Explorer 。

 handle -p yourProcess.exe > log.txt 

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

从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 ... 

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

以下将工作,虽然你只需要“ CommandLineExecutablePath ” – 不是两个:

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

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

 "C:\Program Files (x86)\Common Files\MyProgram\Agent\agent.exe"