windows batch命令用来确定进程的工作目录

时间:2013-12-13 22:06:05

标签: windows batch-file wmic tasklist taskkill

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

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

3 个答案:

答案 0 :(得分:9)

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

有关详细信息,请参阅the doc

答案 1 :(得分:7)

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

答案 2 :(得分:2)

以下内容有效,但您只需要“CommandLineExecutablePath” - 不是两者都有:

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

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

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