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% )
4 Réponses :
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
… 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).
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:
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:
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
processValue
égal à barLength
ou à un multiple entier.@ 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?
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 )
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 ...
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!
Si vous le souhaitez, vous pouvez facilement imprimer des codes ascii avec cette application:
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
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 deset a/
?float
n'est pas pris en charge dans le lot, utilisez plutôtset/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 .