在.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
:这一行赋值。
3条答案
按热度按时间cs7cruho1#
有关从环境变量提取子字符串的信息,请参见https://ss64.com/nt/syntax-substring.html
就个人而言,要完成这项任务,我会使用编程语言,而不是脚本。
xmd2e60i2#
我会这样做:
字符串
由于
"delims="
选项,set "list=%%a"
命令将获得tasklist
的完整输出。例如:型
%list:","=" & set my_win_title="%
是一个 standard substring replacement,表示将每个","
子字符串替换为" & set my_win_title="
。结果行如下:型
最后执行的命令是:
型
得到想要的值
另一种可能更简单的方法:
型
hyrbngr73#
两个示例脚本。都创建一个名称中带有逗号的虚拟文件,用这个虚拟文件启动记事本,运行tasklist查找记事本的标题。第一个只处理带有一个逗号的标题。第二个处理带有和不带逗号的标题。代码有一些注解,但应该不难理解和适应。
实施例1:
字符串
实施例2:
型