Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 是否可以在循环运行时使用批处理文件检查按键?_Loops_Batch File - Fatal编程技术网

Loops 是否可以在循环运行时使用批处理文件检查按键?

Loops 是否可以在循环运行时使用批处理文件检查按键?,loops,batch-file,Loops,Batch File,我对这件事很感兴趣; 我需要一个批处理(大多数其他程序类型在必须运行的系统上受到限制)运行大约10.000次,然后停止 我用这种方法做到了这一点:(这里是广义的和简化的,但我会用它来解释一些东西,因为文件只是点击了一些东西,速度太快了) 上面的代码正在运行,我遇到的问题是风险。 有一个很小的可能性,我需要的程序开始发送击键,这不是一个大问题,如果循环还没有运行。这个程序可能会以某种方式崩溃,导致windows崩溃,这不是我所需要的 所以我要问的问题是: 当循环运行时,是否可以使用类似于if ke

我对这件事很感兴趣; 我需要一个批处理(大多数其他程序类型在必须运行的系统上受到限制)运行大约10.000次,然后停止

我用这种方法做到了这一点:(这里是广义的和简化的,但我会用它来解释一些东西,因为文件只是点击了一些东西,速度太快了)

上面的代码正在运行,我遇到的问题是风险。 有一个很小的可能性,我需要的程序开始发送击键,这不是一个大问题,如果循环还没有运行。这个程序可能会以某种方式崩溃,导致windows崩溃,这不是我所需要的

所以我要问的问题是: 当循环运行时,是否可以使用类似于
if keystrokeinput==anything goto exit
的方法来停止它,或者是否有其他方法可以尝试

如果什么都不起作用,也许第三方程序可以起作用

我希望我的需求和问题是明确的

编辑: 按键需要像全系统一样进行检查。如果批处理需要聚焦/打开并可见,那么它将无法工作。
需要从相应的cmd外部检测击键,这意味着系统是否有任何输入

提前谢谢


Tim

当批处理文件通过
Ctrl-C
中断时,即返回ErrorLevel
-1073741510
或ExitCode
C000013A
。我们可以利用这一点

@echo off
echo Press Y to break
call:function

NEVER REACHED
exit /b

:function
REM WORKS inside cached command block!
(
    echo Loop still in progress...
    choice /C ny /T 1 /D n /N>x
    <x >nul 2>&1 call :checkify
)
goto:function


:checkify
cmd /c exit -1073741510
@echo关闭
按Y键使其断开
调用:函数
从未达到
退出/b
:功能
REM在缓存命令块中工作!
(
回音循环仍在进行中。。。
选项/C ny/T 1/D n/n>x
nul 2>&1调用:检查
)
后藤:功能
:核对
cmd/c出口-1073741510

是,可以通过运行多线程批处理来检测并使用按键退出循环

@Echo off

::: - Test if Key press thread is to be executed
    If /I "%~1" == "Wait" Goto :Wait

::: - Ensure previous Signal files removed in case program exited incorrectly
        Del /Q /F "%TEMP%\CMDrun.log"
        Del /Q /F "%TEMP%\CMDend.log"
    CLS

:Loop
::: - Launch second thread if not already running
    (IF Not Exist "%TEMP%\CMDrun.log" Start /B "" "%~F0" Wait) 2>Nul
    Set /A Count+=1
    Title %Count%
::: - Exit loop on second thread returning keypress
    (IF Exist "%TEMP%\CMDend.log" Goto :End_Loop) 2>Nul
If %Count% LSS 10000 Goto :Loop
:End_Loop
::: - Clean up Signal Files
    Echo. 
    Title Example Complete at count %count%
    Del /Q /F "%TEMP%\CMDrun.log"
    Del /Q /F "%TEMP%\CMDend.log"
    Pause
    Exit

:Wait
::: - Signal main thread run status
    >"%TEMP%\CMDrun.log" Echo Running
::: - Detect keypress
    For /F "Delims=" %%A in ('xcopy /w "%~f0" "%~f0" 2^>nul') do (
        If Not Defined Key Set "Key=%%A"
    )
::: - return keypress in 'end' signal file
    If defined key (
        Setlocal EnableDelayedExpansion
        Set "Key=!Key:~-1!"
        >"%TEMP%\CMDend.log" Echo !Key! && EXIT
        Endlocal
    )
::: - continue waiting for kepress
Goto :Wait

如果你在循环中使用了其他东西,那么如果你真的向我们展示它,而不仅仅是一些随机的、不相关的echo命令,事情就会变得更清楚。代码越不通用,潜在的解决方案就越具体。这是否回答了您的问题?这几乎就是我所需要的,说实话,非常接近。但这个设置的问题是,我需要在相应的cmd上停止它,但这是不可能的。批处理需要运行的程序必须在循环中与之交互。即使在cmd之外,是否有可能检查击键?我不知道有什么方法可以在正在运行的批处理中用于在批处理未激活时检测按键。我使用Aacini的GetKey.exe尝试了批处理脚本,但没有成功。这并不意味着这不能实现,你只需要找到一个可以写入文件的键盘记录程序你的批处理监视器好的键盘记录程序可能是一种方法。因此,如果我找到一个可以执行的脚本,它会像告诉脚本检查特定文档中的更改那样简单吗?只是一个小问题;键盘记录程序不可能通过批处理实现,对吗?不可能直接通过批处理实现,不。你现在正在问一个新问题,关于键盘记录程序以及如何在批处理中控制和交互。我建议在superuser或dostips.com上问这个问题
@Echo off

::: - Test if Key press thread is to be executed
    If /I "%~1" == "Wait" Goto :Wait

::: - Ensure previous Signal files removed in case program exited incorrectly
        Del /Q /F "%TEMP%\CMDrun.log"
        Del /Q /F "%TEMP%\CMDend.log"
    CLS

:Loop
::: - Launch second thread if not already running
    (IF Not Exist "%TEMP%\CMDrun.log" Start /B "" "%~F0" Wait) 2>Nul
    Set /A Count+=1
    Title %Count%
::: - Exit loop on second thread returning keypress
    (IF Exist "%TEMP%\CMDend.log" Goto :End_Loop) 2>Nul
If %Count% LSS 10000 Goto :Loop
:End_Loop
::: - Clean up Signal Files
    Echo. 
    Title Example Complete at count %count%
    Del /Q /F "%TEMP%\CMDrun.log"
    Del /Q /F "%TEMP%\CMDend.log"
    Pause
    Exit

:Wait
::: - Signal main thread run status
    >"%TEMP%\CMDrun.log" Echo Running
::: - Detect keypress
    For /F "Delims=" %%A in ('xcopy /w "%~f0" "%~f0" 2^>nul') do (
        If Not Defined Key Set "Key=%%A"
    )
::: - return keypress in 'end' signal file
    If defined key (
        Setlocal EnableDelayedExpansion
        Set "Key=!Key:~-1!"
        >"%TEMP%\CMDend.log" Echo !Key! && EXIT
        Endlocal
    )
::: - continue waiting for kepress
Goto :Wait