在
.cmd
-(或.bat
-)文件中,我们如何获取给定.exe的确切窗口标题(包含特殊字符,如
whitespaces
和,
) ?
类似...
set my_win_title=
for /f "tokens=9 delims=," %%a in ('tasklist /v /fi "imagename eq AnyApp.exe" /fi "windowtitle ne N/A" /fo csv') do (
set my_win_title=%%a
)
...但是例如使用
;
或 |
而不是 ,
作为 .csv
列表的分隔符,因为相关窗口标题本身包含 ,
,因此上面的代码将其截断,仅导致窗口标题不完整。
我已经尝试过显而易见的方法(只需将
,
替换为 ;
),但它不起作用。
set my_win_title=
:此行将变量my_win_title
初始化为空字符串。这样做是为了避免可能已分配给它的任何先前值。for /f "tokens=9 delims=," %%a in ('tasklist /v /fi "imagename eq AnyApp.exe" /fi "windowtitle ne N/A" /fo csv') do (
:此行启动一个 for 循环,迭代括号内命令的输出。命令是tasklist /v /fi "imagename eq AnyApp.exe" /fi "windowtitle ne N/A" /fo csv
,它列出了与以下过滤器匹配的所有进程:
imagename eq AnyApp.exe
:进程的映像名称(可执行文件名称)等于批处理脚本的第一个参数,不带任何引号。例如,如果使用 AnyApp
调用脚本,则此过滤器将匹配图像名称为 AnyApp.exe
的所有进程。windowtitle ne N/A
:进程的窗口标题不等于N/A
。此过滤器将排除任何没有可见窗口或窗口标题的进程。/fo csv
:tasklist命令的输出格式是逗号分隔值(CSV),这意味着每行将包含用逗号分隔的字段,并且每个字段将用双引号括起来。例如,可能的输出行可以是 "AnyApp.exe","1234","Console","1","2,456 K","Running","DESKTOP-ABCDEF\user","0:00:01","My Window Title"
。tokens=9
:此选项指定仅将每行的第九个字段分配给循环变量%%a
。在这种情况下,第九个字段是进程的窗口标题,例如"My Window Title"
。delims=,
:该选项指定分隔字段的分隔符是逗号。这与任务列表命令的输出格式匹配。set my_win_title=%%a
:这一行赋值。要从环境变量中提取子字符串,请参阅https://ss64.com/nt/syntax-substring.html
就我个人而言,我会用真实的编程语言编写真实的程序来完成这样的任务。
脚本语言,尤其是 shell 脚本语言,是一个骗局。
Windows shell 脚本语言更是如此。
如果您仍然决定使用 shell 脚本语言来完成这样的任务,
您需要编写一些非常难看的代码,
并且您必须在没有调试器帮助的情况下做到这一点。