windows 获取给定.exe的窗口标题

atmip9wb  于 2023-11-21  发布在  Windows
关注(0)|答案(3)|浏览(253)

.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-list的后缀,因为所讨论的窗口标题本身包含,,所以上面的代码将其切断,导致只显示不完整的窗口标题。
我已经尝试了显而易见的方法(简单地将,替换为;),但它不起作用。

供大家参考,下面是上面代码的详细解释:

  • 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=,:此选项指定分隔字段的逗号字符为逗号。这与tasklist命令的输出格式匹配。
  • set my_win_title=%%a:这一行赋值。
cs7cruho

cs7cruho1#

  • 使用“/fo LIST”选择列表输出格式
  • 使用“delims=”选择换行符作为分隔符
  • 跳过所有行,以“窗口标题:“开头的行除外:
  • 选择“窗口标题:“之后的部分

有关从环境变量提取子字符串的信息,请参见https://ss64.com/nt/syntax-substring.html

就个人而言,要完成这项任务,我会使用编程语言,而不是脚本。

xmd2e60i

xmd2e60i2#

我会这样做:

for /F "delims=" %%a in ('tasklist /v /fi "imagename eq AnyApp.exe" /fi "windowtitle ne N/A" /fo csv /nh') do set "list=%%a"
set my_win_title=%list:","=" & set my_win_title="%

字符串
由于"delims="选项,set "list=%%a"命令将获得tasklist的完整输出。例如:

set list="AnyApp.exe","1234","Console","1","2,456 K","Running","DESKTOP-ABCDEF\user","0:00:01","My Window Title"


%list:","=" & set my_win_title="%是一个 standard substring replacement,表示将每个","子字符串替换为" & set my_win_title="。结果行如下:

set my_win_title="AnyApp.exe" & set my_win_title="1234" & set my_win_title="Console" & set my_win_title="1" & set my_win_title="2,456 K" & set my_win_title="Running" & set my_win_title="DESKTOP-ABCDEF\user" & set my_win_title="0:00:01" & set my_win_title="My Window Title"


最后执行的命令是:

set my_win_title="My Window Title"


得到想要的值
另一种可能更简单的方法:

for /F "tokens=2*" %%a in (
   'tasklist /v /fi "imagename eq AnyApp.exe" /fi "windowtitle ne N/A" /fo list ^|
   findstr /C:"Window Title"') do set my_win_title=%%b

hyrbngr7

hyrbngr73#

两个示例脚本。都创建一个名称中带有逗号的虚拟文件,用这个虚拟文件启动记事本,运行tasklist查找记事本的标题。第一个只处理带有一个逗号的标题。第二个处理带有和不带逗号的标题。代码有一些注解,但应该不难理解和适应。
实施例1:

@echo off
setlocal
rem this version handles only the windowtitle with one comma.

set "TestFile=TestFile with , comma.txt"
copy nul "%TestFile%"
start "" /min notepad "%TestFile%"
TIMEOUT /T 2 /NOBREAK
rem show results of tasklist
tasklist /v /fi "imagename eq notepad.exe" /fo csv

rem the code that gets the title
set "my_win_title="
for /f "tokens=9,10 delims=," %%a in ('tasklist /v /nh /fi "imagename eq notepad.exe" /fo csv') do set my_win_title=%%a,%%b
set my

TIMEOUT /T 2 /NOBREAK
rem cleanup
rem remove quotes for use in taskkill
taskkill /fi "imagename eq notepad.exe" /fi "windowtitle eq %my_win_title:~1,-1%"
del "%TestFile%"
endlocal
pause

字符串
实施例2:

@echo off
setlocal
rem this version handles window title with zero, one or multiple comma's, the only requirement is that all values are quoted.

set "TestFile=TestFile with , comma.txt"
copy nul "%TestFile%"
start "" /min notepad "%TestFile%"
TIMEOUT /T 2 /NOBREAK
rem show results of tasklist
tasklist /v /fi "imagename eq notepad.exe" /fo csv

rem the code that gets the title
set "my_win_title="
for /f "delims=" %%a in ('tasklist /v /nh /fi "imagename eq notepad.exe" /fo csv') do set my_win_title=%%a
set my
rem strip the first 8 values
for /L %%N in (1,1,8) do call set my_win_title=%%my_win_title:*",=%%
set my

TIMEOUT /T 2 /NOBREAK
rem cleanup
rem remove quotes for use in taskkill
taskkill /fi "imagename eq notepad.exe" /fi "windowtitle eq %my_win_title:~1,-1%"
del "%TestFile%"
endlocal
pause

相关问题