我想向用户展示一个微调器,在后台完成某些操作,但不知道它在批处理文件中是如何工作的.
有人有线索吗?
实际上,使用纯本机命令可以很容易地完成这一操作,您只需要知道如何使用它们中更棘手的操作.不需要使用像VBScript这样的外部工具或清除屏幕等令人讨厌的副作用.
您正在寻找的是相当于bash" echo -n
"命令,该命令输出没有换行符的行.在XP批处理中,这是通过使用set /p
带有空输入的" "(请求用户提示响应)来实现的,如下所示:
将输出字符串"Hello again".没有介入换行符.
这个技巧(以及CTRL-H的使用,退格字符可以在下面的测试脚本中看到,它开始(一个接一个)一个10秒的子任务,具有20秒的超时和15秒的子任务任务有10秒的超时.
有效负载脚本由实际运行的脚本创建,其唯一的要求是它完成必须完成的工作,然后在完成时删除标志文件,以便监视器功能能够检测到它.
请记住,此脚本中的^ H字符串实际上是CTRL-H字符,即^ | 是用于转义管道符号的两个单独字符.
@echo off :: Localise environment. setlocal enableextensions enabledelayedexpansion :: Specify directories. Your current working directory is used :: to create temporary files tmp_*.* set wkdir=%~dp0% set wkdir=%wkdir:~0,-1% :: First pass, 10-second task with 20-second timeout. del "%wkdir%\tmp_*.*" 2>nul echo >>"%wkdir%\tmp_payload.cmd" ping 127.0.0.1 -n 11 ^>nul echo >>"%wkdir%\tmp_payload.cmd" del "%wkdir%\tmp_payload.flg" call :monitor "%wkdir%\tmp_payload.cmd" "%wkdir%\tmp_payload.flg" 20 :: Second pass, 15-second task with 10-second timeout. del "%wkdir%\tmp_*.*" 2>nul: echo >>"%wkdir%\tmp_payload.cmd" ping 127.0.0.1 -n 16 ^>nul echo >>"%wkdir%\tmp_payload.cmd" del "%wkdir%\tmp_payload.flg" call :monitor "%wkdir%\tmp_payload.cmd" "%wkdir%\tmp_payload.flg" 10 goto :final :monitor :: Create flag file and start the payload minimized. echo >>%2 dummy start /min cmd.exe /c "%1" :: Start monitoring. :: i is the indicator (0=|,1=/,2=-,3=\). :: m is the number of seconds left before timeout. set i=0 set m=%3nul :: Update counters and output progress indicator. set /a "i = i + 1" set /a "m = m - 1" if %i% equ 4 set i=0 if %i% equ 0
2> carlsomo..:试试这个:
@ECHO OFF SETLOCAL ENABLEDELAYEDEXPANSION CALL :BACKSPACE $BS SET /A FULL_COUNT=60 SET /A MAX_COUNT=160 SET /A Spin_Delay=50 SET "_MSG=Process running..." SET /A CTR=0 SET /A TCT=0 IF NOT [%1]==[] SET _MSG=%~1 IF NOT [%2]==[] SET /A FULL_COUNT=%2 IF NOT [%3]==[] SET /A SPIN_DELAY=%3 IF %FULL_COUNT% GTR %MAX_COUNT% SET FULL_COUNT=%MAX_COUNT% (SET/P=%_MSG%*)nul set/a msecs=(%msecs% %% 1000)/10 for /f "tokens=1-4 delims=:." %%a in ("%time1%") do ( set hour1=%%a&set min1=%%b&set sec1=%%c&set "mil1=%%d" ) if /i %hour1:~0,1% equ 0 if /i "%hour1:~1%" neq "" set hour1=%hour1:~1% if /i %min1:~0,1% equ 0 set min1=%min1:~1% if /i %sec1:~0,1% equ 0 set sec1=%sec1:~1% if /i %mil1:~0,1% equ 0 set mil1=%mil1:~1% set/a sec1+=(%hour1%*3600)+(%min1%*60) set/a msecs+=%mil1% set/a tsecs+=(%sec1%+%msecs%/100) set/a msecs=%msecs% %% 100 :: check for midnight crossing if /i %tsecs% geq 86400 set /a tsecs-=86400 set/a hour2=%tsecs% / 3600 set/a min2=(%tsecs%-(%hour2%*3600)) / 60 set/a sec2=(%tsecs%-(%hour2%*3600)) %% 60 set/a err=%msecs% if /i %msecs% neq 0 set /a msecs+=%correct% if /i 1%msecs% lss 20 set msecs=0%msecs% if /i 1%min2% lss 20 set min2=0%min2% if /i 1%sec2% lss 20 set sec2=0%sec2% set time2=%hour2%:%min2%:%sec2%.%msecs% :wait set timen=%time: =% if /i %timen% geq %time2% goto :end goto :wait :end for /f "tokens=2 delims=." %%a in ("%timen%") do set num=%%a if /i %num:~0,1% equ 0 set num=%num:~1% set/a err=(%num%-%err%)*10 endlocal&exit /b %err%