我摘录了我正在使用的批处理文件的一部分。我正在尝试制作进度条,而不是按超时输出数字计数。
我的问题是,如何在循环中动态修改字符串,而不必重新输入字符串的每一步?
@echo off
setlocal enabledelayedexpansion
:: This is to set variables that represent backspace and carriage return.
:: I begin strings with these, instead of ending strings with only CR,
:: so that the cursor isn't flashing under the first character of the
:: progress bar. Beginning each string with a space, and ending each
:: with !CR! only is another possible workaround.
for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a"
for /f %%a in ('"prompt $H&for %%b in (0) do rem"') do set "BS=%%a"
<nul set /p"= [ ]" & Timeout /t 1 >nul
<nul set /p"=!BS!!CR![■ ]" & Timeout /t 1 >nul
<nul set /p"=!BS!!CR![■■ ]" & Timeout /t 1 >nul
<nul set /p"=!BS!!CR![■■■ ]" & Timeout /t 1 >nul
<nul set /p"=!BS!!CR![■■■■ ]" & Timeout /t 1 >nul
<nul set /p"=!BS!!CR![■■■■■ ]" & Timeout /t 1 >nul
<nul set /p"=!BS!!CR![■■■■■■ ]" & Timeout /t 1 >nul
<nul set /p"=!BS!!CR![■■■■■■■ ]" & Timeout /t 1 >nul
<nul set /p"=!BS!!CR![■■■■■■■■ ]" & Timeout /t 1 >nul
<nul set /p"=!BS!!CR![■■■■■■■■■ ]" & Timeout /t 1 >nul
<nul set /p"=!BS!!CR![■■■■■■■■■■]" & Timeout /t 1 >nul
如您所见,我目前输入了 11 个命令(好吧,复制/粘贴然后修改每一行)来创建进度条的进度。
我更希望有一个循环,可以根据循环次数调整条形的宽度,然后每次循环时用块替换最左边的空间。这样我就可以在任意长度的等待中重复使用它,甚至可以显示批处理进程的进度(我不想让这些进程充斥整个屏幕),而不需要每次都进行大量修改。
不幸的是,说实话,我对批处理不是很了解;我知道的足够多的东西可以用 Google-Fu 来破解,但我的搜索词并没有给我带来很好的结果,而且我不确定我尝试做的事情是否可行。任何帮助,哪怕只是一个起点,都会很感激。
答案1
我不确定我是否理解你的问题,但是这里有一个基于子字符串和for /l
循环的建议:
@echo off
>nul chcp 65001
set "_spc= "
set "_bar=■■■■■■■■■■"
setlocal enabledelayedexpansion
for /f %%a in ('copy /Z "%~dpf0" nul')do for /f skip^=4 %%b in ('echo;prompt;$H^|cmd')do set "BS=%%~b" & set "CR=%%a"
for /l %%L in (1 1 10)do <con: set /p "'= !CR!!BS!!CR![!_bar:~0,%%~L!!BS!!_spc:~%%~L!] " <nul & >nul timeout.exe /t 1
endlocal & goto :eof
- 或者类似这样的:
@echo off
>nul chcp 65001
setlocal enabledelayedexpansion
set "_spc= "
set "_bar=■■■■■■■■■■"
set "_msg= Progress bar loop."
<con: color 0A & mode 70,4 & echo\
for /f %%a in ('copy/Z "%~dpf0" nul')do for /f skip^=4 %%b in ('echo;prompt;$H^|cmd')do set "BS=%%b" & set "CR=%%a"
for /l %%L in (1 1 10)do <con: set/p "'=!CR!!BS!!CR![!_bar:~0,%%~L!!BS!!_spc:~%%L!]!_msg!"<nul & >nul timeout.exe 1
endlocal & color & goto :eof