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

use*_*276 9 windows batch-file tasklist taskkill wmic

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

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

wds*_*xsj 12

WDKt救援!其输出的第二行("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
 ...
Run Code Online (Sandbox Code Playgroud)

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


Sun*_*nny 9

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

它的基于GUI的版本是Process Explorer.

handle -p yourProcess.exe  > log.txt
Run Code Online (Sandbox Code Playgroud)

它将列出日志文件中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>
Run Code Online (Sandbox Code Playgroud)

如果你想专门解析它,你可以在纯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
Run Code Online (Sandbox Code Playgroud)

  • handle.exe不会导出"当前工作目录".知道为什么吗? (3认同)
  • @barlop:是的,工作目录(也称为当前目录)与启动进程的可执行文件的路径无关。虽然所有进程 - 包括 GUI 应用程序 - 都有一个(单个)工作目录,如 [tlist` 报道](/sf/answers/1809718431/),但这并不一定意味着它是程序向_用户_提供的同一目录作为要操作的目录。文件资源管理器就是一个例子,因为它有自己的(不可见的)工作目录。是“C:\Windows\System32”,但用户的“当前”目录是 GUI 中显示的任何目录。 (2认同)