4
votes

Barre de progression Dos

Je suis nouveau dans les commandes par lots et je veux atteindre la barre de progression comme dans l'image. Vous devez d'abord initialiser la valeur de processus et calculer le pourcentage de celle-ci et vous devez l'afficher à l'aide de la barre de progression.

Vous pouvez faire Alt + 219 et Alt + 176 pour la barre de progression

Voici ce que j'ai fait jusqu'ici.

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%
)


12 commentaires

Les fichiers par lots n'ont pas la capacité d'afficher des graphiques de la manière dont votre image se reflète. Ce sont des sorties texte uniquement.


Regarde ça. dostips.com/forum/viewtopic.php?p=8227 Ce n'est peut-être pas exactement ce que vous voulez, mais cela vous rapprochera.


@KenWhite. Je pense que vous pouvez faire Alt + 219 et Alt + 176


D'ACCORD. Allez-y et faites-le alors. :-)


Je pense que vous pouvez utiliser une combinaison de séquences ANSI et la capacité de FORFILES à imprimer des caractères ascii, je ne vois pas comment.


@KenWhite. D'accord. Qu'en est-il des opérations arithmétiques, pouvez-vous nous aider? Merci


vouliez-vous dire set/a au lieu de set a/ ?


float n'est pas pris en charge dans le lot, utilisez plutôt set/a"percentage=%%a*100/%processValue%"


@ HackingAddict1337. D'accord. Quoi d'autre? La seule sortie que j'obtiens est toujours echo Valeur du processus:% processValueString%


essayez celui-ci: for /F %%C in ('copy /Z "%~f0" nul') do for /L %%N in (1 1 %processValue%) do set/p"=Processing: %%N / %processValue%%%C"<nul


Même chose. Vous avez oublié de faire écho sur la boucle for?


Continuons cette discussion en chat .


4 Réponses :


1
votes

Des séquences ANSI ont été ajoutées dans le cadre de la mise à jour Redstone , donc cela ne fonctionnera qu'à partir de Windows 10+

Utilisez une combinaison de séquences ANSI et la capacité de FORFILES à imprimer des caractères ASCII

@echo off
====SETLOCAL EnableDelayedExpansion EnableExtensions
cls


::SETTINGS
color a
>nul "%__APPDIR__%CHCP.COM" 65001
"%__APPDIR__%MODE.COM" CON: COLS=120 LINES=31


::INITIALIZE
::Custom parameters defined by user
set "bar_ASCII=0xDB"
set "tbd_ASCII=0xB0"
set/a"#len=40,#totalValue=200,#newlines=1" %====# of newlines to echo before progressBar, >0====%

::DEFAULTS
set "overwrite=x"
FOR /L %%# in (1,1,6) do set "overwrite=!overwrite!!overwrite!"
%= CLEAR VARIABLES =%
set "loaded="
set "remain="
set "progressBar="


::Set LOADED & REMAIN
>hex.tmp <hex.tmp (
    "%__APPDIR__%FORFILES.EXE" /P "%~dp0." /M "%~nx0" /C "cmd /c echo(!bar_ASCII!!tbd_ASCII!"
    set/p"=" SKIP empty line
    set/p"_=" GET 2nd line
)
del hex.tmp
set "loaded=!_:~0,1!"
set "remain=!_:~1!"


::Set $NEWLINES
FOR /L %%L in (2,1,%#newlines%) do set ^"$newlines=!$newlines!^
%====DO NOT REMOVE ME====%
"
echo(
for /L %%N in (0,1,%#len%) do set "progressBar=!progressBar!!loaded!"
for /L %%N in (0,1,%#totalValue%) do (
    set/a"percentage=%%N*100/#totalValue"
    echo(!$newlines!
    echo(Percent: !percentage!%%
    echo(Processing: %%N / %#totalValue%
    echo(!progressBar:~0,%%N!
    >con "%__APPDIR__%TIMEOUT.EXE" /t 1 /nobreak %====Time delay in SECONDS, do not set to 0====%|"%ComSpec%"/Q /C "FOR /F %%C in ('copy /Z "%~f0" nul') do set/p"=_%%C%overwrite%""
)


====ENDLOCAL
exit /b

Sources:


Modifier : cette réponse est limitée à 1 bar / seconde, mais est compatible avec toutes les versions de Windows à partir de 7. (Sur certains, le commutateur /NOBREAK n'est pas pris en charge.)

Chez DosTips , @Aacini a découvert que TIMEOUT redirigé vers CON ramène le curseur à la maison! @jeb a également montré que la sortie peut être éliminée via la tuyauterie | (normalement, TIMEOUT ne prend pas en charge la tuyauterie, donc SET /P est utilisé.) Cependant, il est (presque) impossible de supprimer le compte à rebours en haut.

@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


14 commentaires

… Ce n'est pas la bonne couleur! mais plus important encore, comme l'OP n'a pas spécifié de système d'exploitation, il est important de noter que les séquences d'échappement ANSI ne sont pas disponibles dans les versions antérieures de Windows, vous utilisez Windows-10 .


Ce que je veux dire, ce n'est pas qu'il existe des alternatives, je suis sûr que je pourrais en créer une (si j'étais assez enfantine pour en avoir besoin) . Mon point était que lorsque votre solution est limitée uniquement à la version la plus récente du système d'exploitation et que l'OP n'a pas utilisé une balise de version spécifique, ou l'a mentionnée dans son titre ou son corps de texte, il n'est pas clair que votre réponse ne fonctionne pas dans d'autres versions. Actuellement, alors que l'une des pages liées mentionne Windows 10, vous devrez faire défiler pour le trouver, et vous ne devriez pas vous attendre à celui des futurs lecteurs. Précisez-le simplement dans votre réponse ou proposez une alternative aux systèmes d'exploitation antérieurs.


@ HackingAddict1337. Bon 2. Pouvez-vous mettre le «%» au-dessus du mot «Traitement» comme dans l'image?


les noms de variables sont explicites, donc oui, vous pouvez. n'oubliez pas de le rediriger vers stream3 >&3 . (le script s'interrompt immédiatement lorsque ctrl-c est pressé lors du chargement de la barre)


@ HackingAddict1337. Je mets & 3 echo (Pourcentage:! Pourcentage!% Et il exécute plusieurs lignes après cela


Continuons cette discussion en chat .


@ HackingAddict1337. Veuillez vérifier ce lien vidéo. imgur.com/a/rK6DOQE. J'ai besoin de quelque chose comme ça. Le numéro de la barre de progression saute parfois n'importe quel numéro, comme ce que fait une application normale, si Internet va vite, le numéro de chargement sautera beaucoup de chiffres


@ HackingAddict1337 L'avez-vous compris comme dans la vidéo?


Qu'est-ce qui diffère de mon code par rapport à la vidéo que j'ai regardée mille fois, essayez-vous de vraiment measure quelque chose ou simplement de créer de l'art ascii? je n'ai pas ... qu'est-il arrivé à Continuons cette discussion dans le chat ? btw, il vaut mieux paste simplement le lien dans votre question


@ HackingAddict1337. Je ne sais pas ce que la vidéo essaie de faire. MAIS vous avez vu dans la vidéo que la vitesse de progression n'est pas constante, alors comment feriez-vous cela?


vous voulez donc changer la vitesse de la barre de progression? ⊙__⊙


@ HackingAddict1337. Oui et bien sûr la vitesse de progression n'est pas constante, elle change de temps en temps comme ce que vous avez vu dans cette vidéo


@ HackingAddict1337 Avez-vous compris?


@Compo @Robert J'ai fourni une alternative. La nouvelle réponse est compatible avec presque toutes les versions de Windows (où TIMEOUT est pris en charge).



1
votes

Avec quelques modifications mineures du code de HackingAddict1337, il est possible d'avoir une longueur totale fixe (sélectionnable) de la barre:

Starting at 15:58:44,10
 ██████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
Processing: 32 / 200 = 16%

(adapté au code plus rapide de HackingAddicts)

Les préoccupations de Joseph:

  1. Vous n'avez pas l'apparence de la "barre de mesure", cela devrait ressembler à l'ALT + 176, c'est je pense que ce code "echo [% emptybar%]".
    adapté pour avoir l'air comme vous le souhaitez:

  2. Une autre chose qui vous manque est très simple juste le pourcentage, ex: Pourcentage: 10%.
    également adapté:

@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
  1. La vitesse du bâton de barre de progression est variable, ce qui signifie que la vitesse par pas n'est pas constante.
    c'est à cause de l'arrondissement. Nous ne pouvons rien y faire, sauf que nous processValue égal à barLength ou à un multiple entier.


6 commentaires

@ HackingAddict1337: si vous souhaitez l'inclure dans votre code, vous êtes les bienvenus. Je supprimerai ma réponse alors.


Votre code est le plus proche de la sortie que je voulais. Juste des corrections mineures nécessaires. 1. Vous n'avez pas l'apparence de la "barre de mesure", cela devrait ressembler à l'ALT + 176, c'est je pense que ce code "echo [% emptybar%]". 2. Une autre chose qui vous manque est très simple juste le pourcentage, ex: Pourcentage: 10%. 3. La vitesse du bâton de barre de progression est variable, ce qui signifie que la vitesse par pas n'est pas constante.


@Stephan j'étais en train de trop compliquer les choses et maintenant j'ai une version beaucoup plus rapide, je vais poster ça


@ HackingAddict1337. Génial. Prenez juste note des 3 problèmes ici


Veuillez vérifier ce lien vidéo. imgur.com/a/rK6DOQE . J'ai besoin de quelque chose comme ça. Le numéro de la barre de progression saute parfois n'importe quel numéro, tout comme le fait une application normale, si Internet va vite, le numéro de chargement sautera beaucoup de chiffres. Pouvez-vous également mettre les 16% au-dessus du traitement de texte? Tout comme dans ma question / lien vidéo ici. Alors c'est tout bon. Merci


@Stephan Avez-vous eu la vidéo?



2
votes

Cela fonctionne ici (très vite!):

EDIT : Code modifié pour "barre à pas variables"

@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

)

entrez la description de l'image ici

Pour plus de détails sur la méthode pour "remonter d'une ligne", voir Déplacer le curseur vers n'importe quelle position en utilisant uniquement la commande ECHO

REMARQUE : La méthode pour déplacer le curseur d'une ligne vers le haut fonctionne dans toutes les versions de Windows, à l' exception de Windows 10 à l'aide de la nouvelle console . Vous devez activer le "mode hérité" dans la console de la fenêtre cmd.exe pour que cette méthode fonctionne ...


14 commentaires

Bien mais dans mon pc, ça ne ressemble pas à ça. Il écrit beaucoup de lignes


Utilisez-vous Windows 10? Activez l'ancienne console comme indiqué dans la réponse ... Vous pouvez la tester dans n'importe quelle autre version de Windows


Oui, j'utilise Windows 10. Puis-je le faire sans activer l'ancienne console? Veuillez également vérifier le commentaire que j'ai écrit sur les réponses des autres. Je pense que vous manquez mon problème numéro 3. Merci


Désolé, je ne sais pas de quoi vous parlez "mon problème numéro 3". Il est plus facile d'écrire "mon problème est ...". Notez que j'ai modifié mon code afin d'utiliser les caractères Alt.216 et Alt-176. Si vous voulez des lettres vertes sur fond noir, utilisez la commande COLOR A


Voici le problème numéro 3. La vitesse du bâton de barre de progression est variable, ce qui signifie que la vitesse par pas n'est pas constante.


Au fait, c'est la sortie de votre code sur mon PC. imgur.com/yAexJzV


J'ai peur de ne pas comprendre. Je suppose que vous utiliserez cette méthode pour passer en revue la progression d'un processus réel composé de 200 étapes (par exemple). Si chaque étape prend un montant variable du total, il vous suffit de spécifier le montant de chaque étape. C'est le seul moyen de gérer une barre de progression à vitesse variable ... J'utilise également Windows 10 et mon code fonctionne bien ici. Je vous suggère d'activer Legacy Console et de tester le programme (comme je l'ai dit 3 fois maintenant).


J'ai modifié le code pour "barre à étapes variables". S'il vous plaît, passez en revue ...


Question: cette "barre de progression" est-elle juste pour le plaisir? C'est juste un bar qui marche sur l'écran qui ne mesure vraiment rien? Si tel est le cas, changez simplement les 200 étapes par le nombre de caractères dans la barre. De cette façon, la vitesse de la barre sera constante. Sinon, si la barre mesure un processus réel , il n'y a aucun moyen que la barre ait une vitesse constante, à moins que chacune des 200 étapes ne prenne exactement le même temps ... Par exemple, si chaque étape traite un fichier, alors un gros fichier prendra plus de temps qu'un petit fichier ...


Veuillez vérifier ce lien vidéo. imgur.com/a/rK6DOQE . J'ai besoin de quelque chose comme ça. Le numéro de la barre de progression saute parfois n'importe quel numéro, comme ce que fait une application normale, si Internet va vite, le numéro de chargement sautera beaucoup de chiffres


Veuillez répondre: c'est juste pour le plaisir? Votre fichier Batch ne mesure rien de réel?


Mais vous devez vous assurer que si le chargement est de 70%, il ressemble au chargeur à 70%. Pouvez-vous également réviser votre code. Je ne dois pas exécuter la console héritée. Regardez comme les réponses des autres peuples. Ils ont fonctionné sans console héritée. Ils fonctionnent normalement. Tnx


L'avez-vous compris dans la vidéo?


... + 1, ingénieux!



1
votes

Si vous le souhaitez, vous pouvez facilement imprimer des codes ascii avec cette application:

URL de téléchargement:

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

Il y a aussi beaucoup de caractères pour les barres de progression.


la syntaxe est simple:

char 186 " " 186

Par exemple:

char 186 186 201 186

Vous pouvez également ajouter des caractères vides:

char [ascii code] [ascii code]

J'espère que ça aide


0 commentaires