找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
楼主: wzehu

[文件操作] 【CleanZ】 如何用BAT VBS 静默运行 EXE,自动关闭 EXE 已知确认类弹窗

[复制链接]
 楼主| 发表于 2026-5-14 15:27:09 | 显示全部楼层
我还是想用nircmd命令行工具来完成抓取弹窗:


  1. @echo off
  2. setlocal enabledelayedexpansion
  3.   start "" nircmd.exe infobox "弹窗提示验证!" "提示"
  4. nircmd.exe wait 2002
  5. nircmd.exe win activate ititle "提示"
  6. for /f "skip=1 tokens=*" %%s in ('nircmd.exe win getpos ititle "提示"') do (
  7.     for /f "tokens=2,4 delims=: ,        " %%i in ("%%s") do (
  8.         set x_pos=%%i
  9.         set y_pos=%%j
  10.     )
  11. )
  12. echo X坐标: !x_pos!
  13. echo Y坐标: !y_pos!
  14. nircmd.exe wait 2002

  15. nircmd.exe win activate ititle "提示"
  16. ::nircmd.exe setcursor !x_pos! !y_pos!
  17. movecursor 10 10
  18. nircmd.exe win close ititle "提示"

复制代码


发表于 2026-5-14 21:54:26 | 显示全部楼层
用x64dbg跑一下这个exe找到调用弹窗的地方修改一下比较彻底,跑题了
发表于 2026-5-15 10:53:16 | 显示全部楼层
wzehu 发表于 2026-5-14 15:27
我还是想用nircmd命令行工具来完成抓取弹窗:

你确认nircmd在XP系统支持 getpos 这个参数吗?实测从论坛第三方下载的几个版本均不支持此参数。
 楼主| 发表于 2026-5-15 11:35:26 | 显示全部楼层
我试过了我能有的以下版本,
nircmd.exe
1.8.3.153
2.8.0.225
2.8.1.226
2.8.6.231
2.8.7.232

在XP系统中 getpos  得不到要找的【确定】的X,Y 值
现在要的用更多方法获取(X,Y),定位,点击...
发表于 2026-5-17 17:06:39 | 显示全部楼层
本帖最后由 aloha20200628 于 2026-5-17 17:27 编辑
wzehu 发表于 2026-5-15 11:35
我试过了我能有的以下版本,
nircmd.exe
1.8.3.153


    试试以下代码,存为 test.bat 运行,与 cleanZ.exe, nircmd.exe 同目录。
    核心算法是利用 nircmd 自动捕获当前焦点窗口完成截图的功能,即通过 '主窗口截图(_w0.jpg)尺寸与子窗口(_w1.jpg)截图尺寸差值' 来捕获子窗口,其差值用首行中的变量 %ev% 设定(其单位是字节量,可自行调整,捕获子窗口成功与否直接与此差值预设相关,建议楼主先用 nircmd 单独测试二者文件尺寸,最后选用 ev 值)。
    代码开始会删除当前目录中的 ComputerZ.set 预设文件,以确保直接采用默认选项扫描清理,免除人工干预时段

test.bat
  1. @echo off &setlocal &set/a "n=0,ev=10240"
  2. del /q "ComputerZ.set" 2>nul
  3. start "" cleanZ.exe
  4. nircmd wait 1000
  5. nircmd savescreenshotwin "_w0.jpg"
  6. for %%F in ("_w0.jpg") do set "z0=%%~zF"
  7. :: 给主窗口喂送回车键开始扫描
  8.   nircmd sendkeypress enter
  9. :winLoop
  10.   nircmd wait 500
  11.   nircmd savescreenshotwin "_w1.jpg"
  12.   for %%F in ("_w1.jpg") do set/a "z=z0-%%~zF"
  13.   if %z% lss 0 set/a "z*=-1"
  14.   if %z% lss %ev% goto :winLoop
  15. :: 发现子窗口+给子窗口喂送回车键》第一次开始清理,第二次确认退出
  16.   nircmd sendkeypress enter
  17.   nircmd wait 500
  18.   set/a "n+=1"
  19.   if %n% lss 2 goto :winLoop
  20. taskkill /f /im CleanZ.exe >nul
  21. del /q "_w?.jpg" "%temp%\*.###" 2>nul
  22. exit/b
复制代码

评分

参与人数 1技术 +1 收起 理由
cutebe + 1 熟练钻研

查看全部评分

 楼主| 发表于 2026-5-17 23:32:07 | 显示全部楼层
aloha20200628 发表于 2026-5-17 17:06
试试以下代码,存为 test.bat 运行,与 cleanZ.exe, nircmd.exe 同目录。
    核心算法是利用 nircmd ...


你BAT nircmd  代码经测试运行成功.    

我分析一下流程:
  因为,抓到活动弹窗截图后就会直接回车,回车后弹窗也就必然自动消失,
全程靠时序流程走,不需要对比截图判断.
重点是 nircmd 抓取了弹出当前活动窗口的焦点.
以下缩简后也能正常运行


  1. @echo off &setlocal& mode con cols=28 lines=5
  2. start "" cleanZ.exe
  3. nircmd wait 300

  4. for %%n in (0,1,2) do (
  5.     for %%F in (*) do (
  6.     nircmd savescreenshotwin "_w%%n.jpg"
  7.     nircmd sendkeypress enter
  8.     nircmd wait 500
  9.      )
  10. )
  11. taskkill /f /im CleanZ.exe >nul
  12. del /q "_w?.jpg" "%temp%\*.###" 2>nul
  13. del /q "ComputerZ.set" 2>nul
  14. exit/b
复制代码

 楼主| 发表于 2026-5-19 22:02:52 | 显示全部楼层
网上找到了 xsnip.exe 截图工具. xsnip能看到鼠标pos(x,y)
两次弹出窗口的【确定】位置有共同座标点(700, 500)
利用  nircmd  定位到POS点......



  1. @echo off
  2. start "" CleanZ.exe
  3. nircmd wait 300
  4. nircmd sendkeypress enter
  5. for %%n in (0,1,2) do (
  6.     nircmd wait 1000   ::预留 扫描,清理时间
  7.     for /l %%i in (1,1,6) do (
  8.         nircmd movecursor 700 500
  9.         if exist "ComputerZ.set" goto Bend
  10.         nircmd sendkeypress enter
  11.         nircmd wait 500
  12.     )
  13. )
  14. :Bend
  15.         nircmd wait 500   ::可看清CleanZ完整流程
  16. taskkill /f /im CleanZ.exe
  17. del /q "ComputerZ.set" "%temp%\*.###" 2>nul
  18. exit/b

复制代码
发表于 2026-5-19 23:36:05 | 显示全部楼层
本帖最后由 aloha20200628 于 2026-5-20 08:36 编辑
wzehu 发表于 2026-5-17 23:32
你BAT nircmd  代码经测试运行成功.   

我分析一下流程:



    以下是对50楼代码的几点说明,以便其采用批处调用 nircmd 捕获子窗口的方法可以扩展应用到其他类似场合。
    一。nircmd 可以自动捕获并完成当前活动窗口(包括子窗口)的截图,这是关键。
    二。但 cleanZ.exe 从启动到退出期间被 nircmd 连续分时截图,其每个截图结果的尺寸是变化的(尤其是当扫描和清理过程较长时),好在只是判断主窗口和两个相同子窗口的差别,而基于这一个差别特征对 nircmd 可靠捕获子窗口已经足够了。
    三。根据楼主提供的主窗口和子窗口的截图尺寸比例,可见其差值明显,但因批处不能直接处理浮点运算,故50楼代码采用了二者的 '减量绝对值' 来简化差值估算方法。
    四。正是因为主窗口和子窗口的截图尺寸比例差别明显,50楼代码中的 ev 变量值就很容易估值了。
 楼主| 发表于 2026-5-20 15:55:37 | 显示全部楼层
wzehu 发表于 2026-5-14 15:27
我还是想用nircmd命令行工具来完成抓取弹窗:


今天又学会了nircmd几条命令:
nircmd win activate title "清理武器" '激活窗口  title  精确窗口标题
nircmd win exists title "清理武器"        检查窗口是否存在,返回%errorlevel%


  1. @echo off
  2. start "" CleanZ.exe
  3. nircmd wait 300
  4. :::nircmd win activate title "清理武器 V1.3 www.zwuqi.com"
  5. nircmd sendkeypress enter
  6. nircmd wait 1000
  7. :loop
  8. if exist "ComputerZ.set" goto end
  9. nircmd win exists title "清理武器"
  10. if %errorlevel% equ 1  (nircmd wait 300 & goto loop)
  11. nircmd sendkeypress enter
  12. nircmd wait 500
  13. goto loop

  14. :end
  15. nircmd wait 500
  16. taskkill /f /im CleanZ.exe
  17. del /q "ComputerZ.set" "%temp%\*.###" 2>nul
  18. exit/b

复制代码


评分

参与人数 1技术 +1 收起 理由
cutebe + 1 钻研精神值得点赞

查看全部评分

发表于 2026-5-20 21:25:51 | 显示全部楼层
wzehu 发表于 2026-5-20 15:55
今天又学会了nircmd几条命令:
nircmd win activate title "清理武器" '激活窗口  title  精确窗口标题
n ...

nircmd win exists title "清理武器"  这命令是对的?像是ai编的,还存在第三人称
 楼主| 发表于 2026-5-20 21:48:50 | 显示全部楼层
77七 发表于 2026-5-20 21:25
nircmd win exists title "清理武器"  这命令是对的?像是ai编的,还存在第三人称 ...


我在cmd窗口 和BAT 中  反复验证:
nircmd win exists title "清理武器"
if %errorlevel% equ 1  (nircmd wait 300 & goto loop)
if  errorlevel  1  (nircmd wait 300 & goto loop)

CMD命令提示符下:   nircmd win exists title "清理武器"& if  not errorlevel  1 (nircmd wait 300&echo  %errorlevel% &pause& goto loop)

F:\Python34\抓到弹窗>nircmd win exists title "清理武器"& if  not errorlevel 1  (
nircmd wait 300&echo  %errorlevel% &pause& goto loop)
0
请按任意键继续. . .

确定: nircmd win exists title "清理武器"
         nircmd win exists title "清理武器 V1.3 www.zwuqi.com"
正常通过,不同的 IF 返回 不同的 %errorlevel%值

nircmd win activate title "清理武器"
nircmd win exists title "清理武器"
命令确实有效。。。。   




发表于 2026-5-20 22:15:37 | 显示全部楼层
wzehu 发表于 2026-5-20 21:48
我在cmd窗口 和BAT 中  反复验证:
nircmd win exists title "清理武器"
if %errorlevel% equ 1  (nircmd ...

命令来源?nircmd win xxx title "qwer" 乱写,同样返回0。
 楼主| 发表于 2026-5-21 00:04:37 | 显示全部楼层

        nircmd win activate title "清理武器 "
        nircmd win activate title "清理武器 V1.3 www.zwuqi.com"
        我在CMD 符下分别通过

在BAT 中,我也怀疑过返回%errorlevel%真实性,   IF 行有没有跑
用 if  not errorlevel  1 (nircmd wait 300&echo  %errorlevel% &pause& goto loop)
     if    errorlevel  0 (nircmd wait 300&echo  %errorlevel% &pause& goto loop)
看到了  "0"和 暂停。且  CleanZ.exe  成功完成。没看透 0 的真假
原BAT 是 循环 enter  维持了 CleanZ.exe  操作的成功.

我一直在努力学习中,也付出很多时间与精力.这也就是一种爱好与寄托!
多谢网友不吝赐教 !但愿能探讨更多谜团。。。










发表于 2026-5-22 15:18:50 | 显示全部楼层
本帖最后由 aloha20200628 于 2026-5-22 16:05 编辑
wzehu 发表于 2026-5-21 00:04
nircmd win activate title "清理武器 "
        nircmd win activate title "清理武器 V1.3 www. ...


    一。查过 nircmd 命令参考文件(nircmd.chm),没有 win exists 参数关键字,也没有以前说过的 win getpos 参数关键字。
    二。win activate title, savescreenshotwin 都是实测有效的参数关键字。
    三。如果 cleanZ.exe 的主窗口和子窗口的标题相同,采用 nircmd win activate title 捕获的当前活动窗口如何可靠判断主次呢?
    四。虽然可以改用原始的时序等候方法捕获子窗口出现,但与是否采用 win activate title 已经无关,如果没有其他交互型应用同时运行,cleanZ.exe 被启动至退出就会一直抢占当前活动窗口。
    五。关键是,不同的扫描清理时长需要不同的时序等候(如从几秒到几分钟甚至更长)才能可靠捕获几个子窗口顺序出现,因此一个定量时序不能适应多种扫描清理实况
    六。50楼代码最终采用了 nircmd savescreenshotwin 完成当前活动窗口截图,再比较前后截图尺寸的明显变化,以便在多种不同扫描清理实况中能及时可靠地判断主次窗口
 楼主| 发表于 2026-5-22 22:18:53 | 显示全部楼层
aloha20200628 发表于 2026-5-22 15:18
一。查过 nircmd 命令参考文件(nircmd.chm),没有 win exists 参数关键字,也没有以前说过的 win g ...



cleanZ的主窗口标题是"清理武器 V1.3 www.zwuqi.com" 子窗口的标题是"清理武器"
win activate title  "清理武器 V1.3 www.zwuqi.com"   title 可激活 精确标题
win activate ititle "清理武器" ititle 则能模糊匹配 主窗口标题与 子窗口标题
用win activate title 区分精确标题 激活窗口后, enter即能准确命中【确定】按纽

因为nircmd命令行工具 捕捉不到pos(x,y),
用xsnip.exe 可以看到两子窗口【确定】位置有共同座标   (700 500)        
52楼代码在(x,y)位置连续enter对于主窗口不起作用,但能准确击中两子窗口【确定】按纽

50楼用对比截图尺寸方式区分窗口,确实是个稳妥的方法...但不是唯一方法。
我们要破获更多途径 ...   
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-6-15 18:52

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表