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

问题描述 投票:0回答:3

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

由于这些进程是由第 3 方创建的,因此我需要在创建它们后通过运行 taskkill 或其他方式来终止它们。有没有办法在批处理文件中使用开箱即用的 Windows 命令来找出进程的当前工作目录?如果这可以通过 wmic 查询来完成,那就更好了,但在使用 wmic 时我似乎找不到当前工作目录。我假设如果 Process Explorer 能够获取此信息,我也应该能够通过一些批处理命令获取它。

windows batch-file wmic tasklist taskkill
3个回答
16
投票
来自

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

请参阅文档了解更多信息。


14
投票

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

-3
投票

以下内容将起作用,尽管您只需要“

CommandLine
ExecutablePath
” - 而不是两者:

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

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

"C:\Program Files (x86)\Common Files\MyProgram\Agent\agent.exe"
© www.soinside.com 2019 - 2024. All rights reserved.