循环设置/p?
Set /p in a loop?
这可能是不可能的,但我有一个循环,通过使用 TYPE
键入 logo_(framenumber).txt
来显示动画徽标,并且 framenumber
由循环确定:
:s
if %m%==379 set m=0
cls
TYPE Logo_%m%.txt
set /a m=%m%+1
goto s
我希望能够使用 set /p
选项并且没有 disturbing/stopping 循环,以便在用户输入 set /p
输入时播放动画。我认为有一种方法可以用 FOR
来做到这一点,但我不确定怎么做。有任何想法吗?谢谢。
编辑:这可以批量进行。参见 Aacini 的回答。
这对于批处理文件是不可能的。批处理命令是单线程的。要 运行 两件事同时需要 cmd.exe 的两个实例。但是控制台子系统一次只允许一个程序拥有控制台,所以如果 cmd 的第二个实例附加到同一个控制台,其中一个必须被阻止。
使用 WriteConsoleOutput
修改控制台屏幕上的字符的 win32 可执行文件可以执行类似的操作。如果这样做,您将不再局限于转储文本文件,但缺点是它比批量调用 type
工作量大得多。
虽然这个话题有些老了,但我也是刚刚发现的。这是一个运行良好的纯批处理文件解决方案:
编辑:我稍微修改了代码以使其更简单。
@echo off
setlocal EnableDelayedExpansion
if "%1" equ "Animate" goto %1
for /F %%a in ('echo prompt $H ^| cmd') do set "BS=%%a"
for /F %%a in ('copy /Z "%~F0" NUL') do set "CR=%%a"
cd . > input.txt
start "" /B "%~F0" Animate
set "input="
:nextKey
set "key="
for /F "delims=" %%K in ('xcopy /W "%~F0" "%~F0" 2^>NUL') do if not defined key set "key=%%K"
if "!key:~-1!" equ "!CR!" goto endInput
if "!key:~-1!" equ "!BS!" (
if defined input set "input=%input:~0,-1%"
) else (
set "input=%input%!key:~-1!"
)
set /P "=%input%" > input.txt < NUL
goto nextKey
:endInput
del input.txt
echo/
echo/
echo Input read: "%input%"
goto :EOF
:Animate
set "banner= Enter your name please "
set m=0
:loop
if not exist input.txt exit
set /A m=(m+1)%%51
cls
echo/
echo/ !banner:~%m%,31!
echo/
echo/
if exist input.txt (type input.txt) else exit
ping -n 1 -w 300 localhost > NUL
ping -n 1 -w 300 localhost > NUL
ping -n 1 -w 300 localhost > NUL
goto loop
在此解决方案中,动画 "logo" 被横幅取代,但显示一系列文件的方法几乎相同。
这可能是不可能的,但我有一个循环,通过使用 TYPE
键入 logo_(framenumber).txt
来显示动画徽标,并且 framenumber
由循环确定:
:s
if %m%==379 set m=0
cls
TYPE Logo_%m%.txt
set /a m=%m%+1
goto s
我希望能够使用 set /p
选项并且没有 disturbing/stopping 循环,以便在用户输入 set /p
输入时播放动画。我认为有一种方法可以用 FOR
来做到这一点,但我不确定怎么做。有任何想法吗?谢谢。
编辑:这可以批量进行。参见 Aacini 的回答。
这对于批处理文件是不可能的。批处理命令是单线程的。要 运行 两件事同时需要 cmd.exe 的两个实例。但是控制台子系统一次只允许一个程序拥有控制台,所以如果 cmd 的第二个实例附加到同一个控制台,其中一个必须被阻止。
使用 WriteConsoleOutput
修改控制台屏幕上的字符的 win32 可执行文件可以执行类似的操作。如果这样做,您将不再局限于转储文本文件,但缺点是它比批量调用 type
工作量大得多。
虽然这个话题有些老了,但我也是刚刚发现的。这是一个运行良好的纯批处理文件解决方案:
编辑:我稍微修改了代码以使其更简单。
@echo off
setlocal EnableDelayedExpansion
if "%1" equ "Animate" goto %1
for /F %%a in ('echo prompt $H ^| cmd') do set "BS=%%a"
for /F %%a in ('copy /Z "%~F0" NUL') do set "CR=%%a"
cd . > input.txt
start "" /B "%~F0" Animate
set "input="
:nextKey
set "key="
for /F "delims=" %%K in ('xcopy /W "%~F0" "%~F0" 2^>NUL') do if not defined key set "key=%%K"
if "!key:~-1!" equ "!CR!" goto endInput
if "!key:~-1!" equ "!BS!" (
if defined input set "input=%input:~0,-1%"
) else (
set "input=%input%!key:~-1!"
)
set /P "=%input%" > input.txt < NUL
goto nextKey
:endInput
del input.txt
echo/
echo/
echo Input read: "%input%"
goto :EOF
:Animate
set "banner= Enter your name please "
set m=0
:loop
if not exist input.txt exit
set /A m=(m+1)%%51
cls
echo/
echo/ !banner:~%m%,31!
echo/
echo/
if exist input.txt (type input.txt) else exit
ping -n 1 -w 300 localhost > NUL
ping -n 1 -w 300 localhost > NUL
ping -n 1 -w 300 localhost > NUL
goto loop
在此解决方案中,动画 "logo" 被横幅取代,但显示一系列文件的方法几乎相同。