Индикатор выполнения пакетного файла в процентах - PullRequest
3 голосов
/ 02 мая 2020

Я новичок в пакетных командах DOS и хочу получить индикатор выполнения, как на картинке. Сначала вам нужно инициализировать значение процесса и рассчитать его процент, и вы должны отобразить его, используя индикатор выполнения.

Вы можете сделать Alt + 219 и Alt + 176 для индикатора выполнения

Вот картина того, чего я хочу достичь

enter image description here

Вот что я сделал до сих пор.

echo off
cls
SetLocal EnableDelayedExpansion
set processValueString=200
set a/ processValue=200
set a/ percentage=0

echo Process value: %processValueString%

for /l %%a in (1,1, %processValue%) do (
    set a/ percentage = %%a / %processValue% * 100
    echo Percent: !percentage! %
    echo Processing: !a! / %processValue%
)

Ответы [ 4 ]

2 голосов
/ 02 мая 2020

Это работает здесь (очень быстро!):

РЕДАКТИРОВАТЬ : Код изменен для "бара с переменными шагами"

@echo off
SetLocal EnableDelayedExpansion

rem Define the "amounts" of each one of the (7) steps that comprise this job
set "amounts= 10 6 2 9 3 7 4"
set width=60

set "off="
set "on="
for /F "tokens=1,2" %%X in ('FORFILES /M "%~nx0" /C "cmd /c echo 0xDB 0xB0"') do (
   for /L %%i in (1,1,%width%) do set "on=!on!%%X" & set "off=!off!%%Y"
)

rem Get CR, BS and TAB ASCII control characters:
for /F %%a in ('copy /Z "%~f0" nul') do set "CR=%%a"
for /F %%a in ('echo prompt $H ^| cmd') do set "BS=%%a"
set "TAB="
rem First, try the method for Windows XP
for /F "skip=4 delims=pR tokens=2" %%a in ('reg query hkcu\environment /v temp' ) do set "TAB=%%a"
rem Then, the method for newer versions
rem http://www.dostips.com/forum/viewtopic.php?f=3&t=1733&p=6840#p6853
for /F "tokens=2 delims=0" %%a in ('shutdown /? ^| findstr /BC:E') do if not defined TAB set "TAB=%%a"
rem String to go up one line in SET /P command
set "LineUp=%TAB%!BS!!BS!!CR!"

cls
echo Percentage of values processed
echo/
echo %TAB%%off%
echo %TAB%Percent: 0%%
echo %TAB%Processing: 0/%processValue%

set /A "processValue=0, summa=0"
for %%a in (%amounts%) do set /A processValue+=%%a
for %%N in (%amounts%) do (
   set /A "summa+=%%N, Percent=summa*100/processValue, PercentOn=Percent*width/100
   for %%i in (1,1,4) do set /P "=.!LineUp!" < nul
   for %%p in (!PercentOn!) do echo %TAB%!on:~0,%%p!
   echo %TAB%Percent: !Percent!%%
   echo %TAB%Processing: !summa!/%processValue% (current: %%N^)  

   timeout /T %%N > nul

)

enter image description here

Подробнее о методе "go вверх на одну строку" см. Переместить курсор на любую позицию , используя только команду ECHO

ПРИМЕЧАНИЕ : метод перемещения курсора на одну строку работает во всех Windows версиях , за исключением Windows 10 с использованием новой консоли . Чтобы этот метод работал, вам нужно включить «Legacy mode» в консоли окна cmd.exe ...

1 голос
/ 02 мая 2020

С некоторыми незначительными изменениями в коде HackingAddict1337 можно иметь фиксированную (выбираемую) общую длину полосы:

@echo off
cls
SETLOCAL EnableDelayedExpansion

set /a "processValue=200"
set "bar=0xDB" Character used by progress bar (SUPPORTS HEX)
set "tbd=0xB0"
set "barLength=40"
( set LF=^
%=-----------DO NOT REMOVE THIS LINE. the LF variable is for future use in a function, it's currently useless-----------=%
)
FOR /F %%B in ('FORFILES /P "%~dp0." /M "%~nx0" /C "cmd /c echo(!bar!"') do set "bar=%%B"
FOR /F %%B in ('FORFILES /P "%~dp0." /M "%~nx0" /C "cmd /c echo(!tbd!"') do set "tbd=%%B"
FOR /F %%B in ('copy /Z "%~f0" nul') do set "CR=%%B"
FOR /F %%B in ('prompt $E ^& ^<nul cmd /k') do set "ESC=%%B"
for /l %%N in (0,1,%barLength%) do set "emptybar=!emptybar! "

echo Starting at %time%!LF!
for /l %%N in (0 1 !barLength!) do echo(!LF!%ESC%[2A%ESC%[%%NC%tbd%
for /L %%N in (0 1 %processValue%) do (
  set /a showBar=%%N*barLength/processValue
  set /a percentage=%%N*100/processValue
  echo(Processing: %%N / %processValue% = !percentage!%%!LF!%ESC%[2A%ESC%[!showBar!C%bar%
  ping -4 -n 1 127.0.0.1 >nul 
)
echo !LF!Finished at %time%
pause>nul
ENDLOCAL

(адаптировано для более быстрого кода HackingAddicts)

Проблемы Джозефа :

  1. Вам не хватает вида "измерительной панели", это должно выглядеть как ALT + 176, я думаю, что этот код "echo [% emptybar%]".
    приспособлен для того, чтобы выглядеть так, как вы хотите:

  2. Еще одна вещь, которой вам не хватает, это очень просто, просто процент, например: Процент: 10%.
    также адаптировано:

Starting at 15:58:44,10
 ██████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
Processing: 32 / 200 = 16%
Скорость стика индикатора выполнения является переменной, что означает, что скорость на шаг не постоянна.
Это из-за округления. Мы ничего не можем с этим поделать, кроме как сделать processValue равным barLength или целому кратному.
1 голос
/ 02 мая 2020

История:

  1. Последовательности ANSI были добавлены как часть Обновления Redstone (и оно было удалено и добавлено снова, упомянуто здесь ), следовательно скрипт работает только на Windows 10
  2. Удалено FORFILES, теперь в 250 раз быстрее
  3. Функционализированная версия @ Ответ Стефана
  4. Сценарий теперь прерван немедленно при нажатии Ctrl- C
  5. Редактирование на основе запросов @ Joseph

Используйте комбинацию последовательности ANSI и способность FORFILES печатать символы ASCII

@echo off
^
%=-----------DO NOT REMOVE THIS LINE-----------=%
Y
%= Y to abort when Ctrl-C is pressed =%
%= N to ignore =%
SETLOCAL EnableDelayedExpansion

::Defaults
( set LF=^
%=-----------DO NOT REMOVE THIS LINE-----------=%
)
FOR /F %%C in ('copy /Z "%~f0" nul') do set "CR=%%C"
FOR /F %%E in ('prompt $E ^& ^<nul cmd /k') do set "ESC=%%E"

::SETTINGS
color a
>nul chcp 65001
mode CON: COLS=120 LINES=31

::INITIALIZE
call :init 0xDB] 0xB0 40 200 

echo Starting at %time%
<nul set/p=[
>nul 2>nul call :progessBar
echo Finished at %time%

exit /b


:init bar tbd length processvalue
::Custom parameters defined by user
set "bar=%~1"
set "tbd=%~2"
set /a "barlength=%~3"
set /a "processvalue=%~4" 

::Default values
if NOT DEFINED bar set "bar=0xDB"
if NOT DEFINED tbd set "tbd=0xB0"

::Set bar & tbd
>hex.tmp <hex.tmp (
FOR %%V in (bar tbd) do (
FORFILES /P "%~dp0." /M "%~nx0" /C "cmd /c echo(!%%V!"
set/p"%%V=" CLEAR VARIABLE
set/p"%%V=" SET VARIABLE
))

del hex.tmp
exit /b


:main
>&3 (
  echo(
  for /L %%N in (0 1 %barlength%) do echo(!LF!%ESC%[2A%ESC%[%%NC%tbd%
  for /L %%N in (0 1 %processvalue%) do (
    set/ashowBar=%%N*barlength/processvalue,percentage=%%N*100/processvalue
    echo(Percent: !percentage!%%!LF!Processing: %%N / %processvalue%!LF!%ESC%[3A%ESC%[!showBar!C%bar%
  )
  echo(!LF!
)
exit /b


:progessBar
<"%~f0" call :main

Ужасно смотреть медленно Теперь x250 x320 раз быстрее, чем оригинальная версия! (на моем ноутбуке):

Источники:

0 голосов
/ 03 мая 2020

Если вы хотите, вы можете легко распечатать коды ASCII с этим приложением:

URL-адрес загрузки:

https://mega.nz/file/2AZA3Y5T#y8z1aIKJHPiHmnlkgv -dYmn0J2fozz83uGdXS7umyLE

Там также много символов для индикаторов выполнения.


синтаксис прост:

char [ascii code] [ascii code]

Например:

char 186 186 201 186

Вы также можете добавить пустые символы:

char 186 " " 186

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...