batch-file - 当用户按下按钮时停止循环

标签 batch-file autoit

我正在寻找某种在用户按下按钮时使循环终止的方法。我知道如果你有一个循环,你可以按 control c,但这不是我希望用户必须做的。我不认为这在批处理文件中是可能的,但我期待这里有人证明我错了!

我有另一个想法。使用自动脚本怎么样?在批处理文件的开头,您启动 autoit 脚本。该脚本使用热键功能,按下热键时程序关闭。回到批处理文件中,您每隔一段时间检查一下 autoit 脚本是否正在运行。如果不是,则您知道按下了热键。 我已经测试过它,它可以工作,但我不喜欢每次检查 tasklist.exe 中的 wkey.exe 时产生的延迟。如果我能找到一种更有效的方法来做到这一点,那就太棒了!

批处理文件:

@echo off
start wkey.exe
echo press the w key to stop.
timeout 3
:loop
tasklist /FI "IMAGENAME eq wkey.exe" 2>NUL | find /I /N "wkey.exe">NUL
if %ERRORLEVEL%==1 goto endloop
echo doing stuff . . .
goto loop

:endloop
echo you pressed the w key.
pause
exit

wkey.exe(用autoit语言编写)

#NoTrayIcon
#include <Constants.au3>

HotKeySet("w", "_input")

While 1
    Sleep(10)
WEnd

Func _input()
    Exit
EndFunc

最佳答案

运行它,当您按下控制 (CTRL) 键时,循环将停止执行 - 它仅适用于 32 位机器certutil 不是 XP 原生的看来需要 Vista 和更高版本。

@echo off
>tmp.tmp echo -----BEGIN CERTIFICATE-----
>>tmp.tmp echo uEAAjtigFwC0TM0h
>>tmp.tmp echo -----END CERTIFICATE-----

certutil -decode -f tmp.tmp kbflag.com >nul

for /L %%a in (1,1,10000) do (
echo Press the CTRL key to exit - %%a
kbflag.com
if errorlevel 4 if not errorlevel 5 goto :skip
)
:skip
del kbflag.com
del tmp.tmp
echo Finished.
pause

它使用名为 KBFLAG.COM 的杂志 .com 文件实用程序(.com 文件仅在 32 位机器上工作)监控键盘并设置错误级别可以分支。

这是一个 12 字节的文件,顺序为 B8 40 00 8E D8 A0 17 00 B4 4C CD 21,批处理文件创建和删除它(它被编码到证书数据中)。

您可以找到适用于 64 位系统 的类似工具,它不是 .com 文件。

这是文档文件:

KBFLAG -- by Nico Mark -- from PC Magazine, December 23, 1986 

KBFLAG can be used to cause branching in batch files, so that execution of
different parts of the file can be dependent on the state of toggle and shift
keys.  You can, for example, abort execution of AUTOEXEC.BAT if the CapsLock
key has been toggled while CONFIG.SYS in running.

KBFLAG tests for a keystroke in the buffer, and sets errorlevel to the value of
the key's KBFLAG in the ROM BIOS.  Thus, if the Ins key has been toggled, it
will return an errorlevel of 128.  Other values are:  

    1 = Right Shift 
    2 = Left Shift 
    4 = Ctrl key 
    8 = Alt key
       16 = ScrollLock 
       32 = NumLock 
       64 = CapsLock 
      128 = Ins 

(You can use sums of these values to correspond to combinations of keys, so
96 = CapsLock and NumLock together.) 

If you put these lines at the start of autoexec.bat-- 

    KBFLAG 
    IF ERRORLEVEL 64 GOTO :END 

--and put the label :END at the end of the file, autoexec.bat will then check 
to see if CapsLock has been pressed, and will jump the end of the batch if it
has.   To prevent autoexec.bat from executing on bootup, simply hit CapsLock
while  config.sys is running.     

You can use variations of this technique to cause different sets of programs
to run during autoexec.bat (or any batch file).  For example, Caps Lock could
cause only a few programs to run; Alt + CapsLock could cause others; etc.

关于batch-file - 当用户按下按钮时停止循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19018276/

相关文章:

php - 使用 .bat 文件运行 php 脚本

windows - 如何在 AutoIt 中同时 Winwait 两个窗口?

batch-file - 批处理文件中的变量乘法

postgresql - 如何更改 postgresql 中的默认数据库位置?

linux - Linux环境下使用Selenium验证对话框

testing - AutoIt 中的组合键

internet-explorer - 在浏览器窗口保持最小化的情况下自动化网页(需要主动焦点)

windows - 读取正在运行的进程的文件版本

command-line - 我如何在大多数目录上执行代码,但带有批处理文件的文件中列出的目录除外?

windows - 将批处理文件编译成exe