获取给定.exe的窗口标题

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

.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"
  • for 循环使用以下选项:
    • tokens=9
      :此选项指定仅将每行的第九个字段分配给循环变量
      %%a
      。在这种情况下,第九个字段是进程的窗口标题,例如
      "My Window Title"
    • delims=,
      :该选项指定分隔字段的分隔符是逗号。这与任务列表命令的输出格式匹配。
  • set my_win_title=%%a
    :这一行赋值。
windows batch-file cmd
1个回答
0
投票
  • 使用“/fo LIST”选择列表输出格式
  • 使用“delims=”选择换行符作为分隔符
  • 跳过除以“Window Title:”开头的行之外的所有行
  • 选择“窗口标题:”之后的部分

要从环境变量中提取子字符串,请参阅https://ss64.com/nt/syntax-substring.html

就我个人而言,我会用真实的编程语言编写真实的程序来完成这样的任务。
脚本语言,尤其是 shell 脚本语言,是一个骗局。
Windows shell 脚本语言更是如此。
如果您仍然决定使用 shell 脚本语言来完成这样的任务,
您需要编写一些非常难看的代码,
并且您必须在没有调试器帮助的情况下做到这一点。

© www.soinside.com 2019 - 2024. All rights reserved.