Batch Zeichenanzahl xyz.txt ermitteln oder Fortschrittsbalken unter Batch realisieren.
Hallo,
wieder mal eine Frage zur Batch.
Ich möchte eine art Fortschrittsbalken proggen.
Ich hab das schon mit nem normalen "Counter" hingekriegt. Das wollte ich jetzt auf die Erstellung von Dateien anwenden.
Wenn meine Batch ganz viele Dateien anlegt soll ein Fortschrittsbalken erscheinen, den ich in Abhängigkeit zur erstellten "Zeichenanzahl" proggen wollte.
Ich möchte eine fließende Bewegung des Balkens erreichen, denn es ist blöd, wenn eine Datei angelegt wurde und dann erst der Balken so um 30% nach rechts schießt.
Wie funktioniert das eigentlich wenn ich eine große Datei unter XP kopiere und dann der F.Balken angezeigt wird.
Der muss ja auch in Abhängigkeit zur kopierten Zeichenanzahl stehen?
Kann man das in Batch realisieren ohne meinen noch entstehenden Code mit zigtausend Schleifen für so einen Balken zu füllen?
Wäre für Hilfe sehr dankbar.
florengray
wieder mal eine Frage zur Batch.
Ich möchte eine art Fortschrittsbalken proggen.
Ich hab das schon mit nem normalen "Counter" hingekriegt. Das wollte ich jetzt auf die Erstellung von Dateien anwenden.
Wenn meine Batch ganz viele Dateien anlegt soll ein Fortschrittsbalken erscheinen, den ich in Abhängigkeit zur erstellten "Zeichenanzahl" proggen wollte.
Ich möchte eine fließende Bewegung des Balkens erreichen, denn es ist blöd, wenn eine Datei angelegt wurde und dann erst der Balken so um 30% nach rechts schießt.
Wie funktioniert das eigentlich wenn ich eine große Datei unter XP kopiere und dann der F.Balken angezeigt wird.
Der muss ja auch in Abhängigkeit zur kopierten Zeichenanzahl stehen?
Kann man das in Batch realisieren ohne meinen noch entstehenden Code mit zigtausend Schleifen für so einen Balken zu füllen?
Wäre für Hilfe sehr dankbar.
florengray
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 74358
Url: https://administrator.de/contentid/74358
Ausgedruckt am: 25.11.2024 um 08:11 Uhr
32 Kommentare
Neuester Kommentar
@florengray
Fortschrittsbalken für Batch nicht wirklich möglich - wurde hier schon mehrfach besprochen.
Fortschrittanzeige bei batch bzw batchkopiervorgang
gruß
onegasee59
Fortschrittsbalken für Batch nicht wirklich möglich - wurde hier schon mehrfach besprochen.
Fortschrittanzeige bei batch bzw batchkopiervorgang
gruß
onegasee59
hi, ich bin mir nicht ganz sicher was du machen willst.
ich habe mal ein programm geschrieben welches sehr viel im hintergrund gerechnet hat. allerdings war es immer im gleichen verhältnis.
Also habe ich die proportion ausgenutzt und es mit diesem (leicht abgewandelten) Script realisiert.
@echo off
title Ladebalken
cls
set ladebalken=¦
::==============================::
set /a lade=%end%-%start%
set /a lade1=%lade% / 10
rem ich habe also das verhältnis durch 10 gerechnet und habe somit 10 ladebalkenteile
::====================================
:: [mein script]
:: set /a lade2=%lade2% + %x% << ist von meinem script bedingt!
::
::====================================
:ladebalken
echo Bitte warten wird berechnet...
if %lade2% gtr %lade1% (set ladebalken=%ladebalken%¦) & (set lade2=%lade2%-%lade1%)
cls
echo Bitte warten wird berechnet...
echo.
echo __________
echo %ladebalken%
echo.
goto [meinscript]
also sollte dir das nicht weiter helfen oder ich gar ganz das ziel verfehlt haben, dann gib mir doch mal ein paar konstante parameter (dateienanzahl, inhalt, ... natürlich nur bsp. !!) und ich versuch dir mal was zusammen zu schustern.
gruß erik
ich habe mal ein programm geschrieben welches sehr viel im hintergrund gerechnet hat. allerdings war es immer im gleichen verhältnis.
Also habe ich die proportion ausgenutzt und es mit diesem (leicht abgewandelten) Script realisiert.
@echo off
title Ladebalken
cls
set ladebalken=¦
::==============================::
set /a lade=%end%-%start%
set /a lade1=%lade% / 10
rem ich habe also das verhältnis durch 10 gerechnet und habe somit 10 ladebalkenteile
::====================================
:: [mein script]
:: set /a lade2=%lade2% + %x% << ist von meinem script bedingt!
::
::====================================
:ladebalken
echo Bitte warten wird berechnet...
if %lade2% gtr %lade1% (set ladebalken=%ladebalken%¦) & (set lade2=%lade2%-%lade1%)
cls
echo Bitte warten wird berechnet...
echo.
echo __________
echo %ladebalken%
echo.
goto [meinscript]
also sollte dir das nicht weiter helfen oder ich gar ganz das ziel verfehlt haben, dann gib mir doch mal ein paar konstante parameter (dateienanzahl, inhalt, ... natürlich nur bsp. !!) und ich versuch dir mal was zusammen zu schustern.
gruß erik
@florengray
Das Tool "WGET" welches von der c't in seinem Windows-Update-Lade-Tool und zahlreichen Clons davon verwendet wird bietet so einen Ladebalken. (Ein ständig wachsender Pfeil "->"..."----->"...usw.) Ich bezweifel aber das man das in einem einfachen Batch hinbekommt.
Glaubs einfach, innerhalb einer Batch nicht möglich so wie DU es willst. Da haben sich schon die Batch-Experten hierzu geäußert warum nicht. Link lesen siehe oben.
gruß
onegasee59
Das Tool "WGET" welches von der c't in seinem Windows-Update-Lade-Tool und zahlreichen Clons davon verwendet wird bietet so einen Ladebalken. (Ein ständig wachsender Pfeil "->"..."----->"...usw.) Ich bezweifel aber das man das in einem einfachen Batch hinbekommt.
Glaubs einfach, innerhalb einer Batch nicht möglich so wie DU es willst. Da haben sich schon die Batch-Experten hierzu geäußert warum nicht. Link lesen siehe oben.
gruß
onegasee59
naja da gibt es eine sehr aufwendige möglichkeit. diese nutze ich um mit komma in batch zu rechnen. (habe ich durch den aufwand auf 6 stellen begrenzt)
hier das script:
::==================================::
@echo off
cls
::erstmal zeile auslesen
for /f %%a in (datei1.*) do (set exp=%%a) && (call :zeichenanz)
:zeichenanz
set a1=1%exp:~0,1%
set a2=1%exp:~1,1%
set a3=1%exp:~2,1%
set a4=1%exp:~3,1%
set a5=1%exp:~4,1%
set a6=1%exp:~5,1%
set a7=1%exp:~6,1%
if %a1% lss 10 (set stellen=0) & (goto ergebnis)
if %a2% lss 10 (set stellen=1) & (goto ergebnis)
if %a3% lss 10 (set stellen=2) & (goto ergebnis)
if %a4% lss 10 (set stellen=3) & (goto ergebnis)
if %a5% lss 10 (set stellen=4) & (goto ergebnis)
if %a6% lss 10 (set stellen=5) & (goto ergebnis)
if %a7% lss 10 (set stellen=6) & (goto ergebnis)
:ergebnis
echo %stellen% >anz.dat
::====================================::
da ich nicht weiß wie man einen gültigkeitsbereich einer marke beendet müsstest du jetzt eine 2. bat calln um die ergebnisse zu addieren. ich denke das könnte dir helfen. muss dazu sagen das dieses script jetzt leicht verändert ist und ich es nicht getestet habe. ausserdem habe ich win vista.
probier es aus aber müsste funktionieren. den rest bekommst du allein hin.
p.s: gibt es eine möglichkeit die stellen einer variable per schleife auszulesen bitte posten.
for /l %%x in (0,1,%anz%) do set a%%x=%exp:~%%x,1%
funktioniert leider nicht, sobald exp deklariert ist
cmd:
for /l %x in (0,1,5) do echo %exp:~%x,1%
%exp:~0,1%
%exp:~1,1%
%exp:~2,1%
%exp:~3,1%
%exp:~4,1%
%exp:~5,1%
set exp=12345
for /l %x in (0,1,5) do echo %exp:~%x,1%
12345x,1%
12345x,1%
12345x,1%
12345x,1%
12345x,1%
12345x,1%
why?
gruß erik
hier das script:
::==================================::
@echo off
cls
::erstmal zeile auslesen
for /f %%a in (datei1.*) do (set exp=%%a) && (call :zeichenanz)
:zeichenanz
set a1=1%exp:~0,1%
set a2=1%exp:~1,1%
set a3=1%exp:~2,1%
set a4=1%exp:~3,1%
set a5=1%exp:~4,1%
set a6=1%exp:~5,1%
set a7=1%exp:~6,1%
if %a1% lss 10 (set stellen=0) & (goto ergebnis)
if %a2% lss 10 (set stellen=1) & (goto ergebnis)
if %a3% lss 10 (set stellen=2) & (goto ergebnis)
if %a4% lss 10 (set stellen=3) & (goto ergebnis)
if %a5% lss 10 (set stellen=4) & (goto ergebnis)
if %a6% lss 10 (set stellen=5) & (goto ergebnis)
if %a7% lss 10 (set stellen=6) & (goto ergebnis)
:ergebnis
echo %stellen% >anz.dat
::====================================::
da ich nicht weiß wie man einen gültigkeitsbereich einer marke beendet müsstest du jetzt eine 2. bat calln um die ergebnisse zu addieren. ich denke das könnte dir helfen. muss dazu sagen das dieses script jetzt leicht verändert ist und ich es nicht getestet habe. ausserdem habe ich win vista.
probier es aus aber müsste funktionieren. den rest bekommst du allein hin.
p.s: gibt es eine möglichkeit die stellen einer variable per schleife auszulesen bitte posten.
for /l %%x in (0,1,%anz%) do set a%%x=%exp:~%%x,1%
funktioniert leider nicht, sobald exp deklariert ist
cmd:
for /l %x in (0,1,5) do echo %exp:~%x,1%
%exp:~0,1%
%exp:~1,1%
%exp:~2,1%
%exp:~3,1%
%exp:~4,1%
%exp:~5,1%
set exp=12345
for /l %x in (0,1,5) do echo %exp:~%x,1%
12345x,1%
12345x,1%
12345x,1%
12345x,1%
12345x,1%
12345x,1%
why?
gruß erik
Moin erik87,
ich lasse den Thread einfach offen, bis Du hier postest: "Das ist Dönekens, einen Laufbalken per Batch simulieren zu wollen."
Zu Deiner letzten Frage: Suche mal hier im Forum oder in der Hilfe am CMD-Prompt nach "DelayedExpansion".
Beispiel:
Output:
Hier eine Laufbalkensimultion per Batch:
Output dann sowas wie:
..und am Ende etwa so etwas:
Ich habe einen kleinen Delay eingebaut (die "For /L ...Set Dummy="- Schleife), damit man/frau überhaupt einen wachsenden Balken sieht.
Sonst ist der Balken sofort komplett.
Du müsstest aber beliebige Dateien byteweise lesen und jeweils nach 3000 Byte Deine Fortschrittsanzeige aktualisieren.
Byteweise lesen oder schreiben geht nicht mit native Batch.
Mit VBS wäre es noch denkbar, aber auch damit eher Aktion für den Karneval oder einen Schülerwettbewerb.
Grüße
Biber
ich lasse den Thread einfach offen, bis Du hier postest: "Das ist Dönekens, einen Laufbalken per Batch simulieren zu wollen."
Zu Deiner letzten Frage: Suche mal hier im Forum oder in der Hilfe am CMD-Prompt nach "DelayedExpansion".
Beispiel:
::-----snipp SubstrDemo.bat
@echo off & setlocal enableDelayedExpansion
for /l %%x in (0,1,4) do call :substr abcde, %%x, 1
goto :eof
:Substr (string, offset, len )
set exp=%1
Echo Substr^(%1,%2, %3^) ist !exp:~%2,%3!
:: ---substrDemo.bat
$cmd$substrDemo.bat
Substr(abcde,0, 1) ist a
Substr(abcde,1, 1) ist b
Substr(abcde,2, 1) ist c
Substr(abcde,3, 1) ist d
Substr(abcde,4, 1) ist e
Hier eine Laufbalkensimultion per Batch:
::---snipp laufbalkendemo.bat
@echo off & setlocal enableDelayedExpansion
set "testdatei=%temp%\testdatei.txt"
:: mit der naächsten Zeile wird nur eine Testdatei erzeugt.
For /? >%testdatei%
:: Zeichen zb chr(291)=?
:: Zeichen zb chr(177)=?
:: Zeichen zb chr(176)=?
Set "b=??????????"
:: Aus Faulheit 10 Zeichen definieren...
Set "Bar=%b%%b%%b%%b%%b%"
:: ... und fünfmal aneinanderpappen...macht einen Bar mit 50 Zeichen.
For /f "delims=:" %%i in ('findstr /n $ "%testdatei%"') do set lines=%%i
:: Anzahl Zeilen steht jetzt in %lines%
For /f "delims=: tokens=1,*" %%i in ('findstr /n $ "%testdatei%"') do call :ProgressPerc %%i
Pause
del %testdatei%
goto :eof
~~~~~
Nebenrechnung: 100% bedeuten 50 Balkenzeichen..
somit Anzahl Zeichen jeweils Prozent / 2
~~~~~~~~
:ProgressPerc
set /a Percent=(%1*100) / lines
set /a BarLen= percent / 2
Cls
echo Line %1 of %lines% = %percent%%%
echo !Bar:~0,%BarLen%!
for /l %%x in (1,1,2000) do set "dummy="
goto :eof
::-----snapp Laufbalkendemo.bat
Output dann sowas wie:
Line 42 of 158 = 26%
?????????????
Line 158 of 158 = 100%
??????????????????????????????????????????????????
Drücken Sie eine beliebige Taste . . .
Sonst ist der Balken sofort komplett.
das ist das, was gerade noch mit Batch-Mitteln ginge:
Anzahl gelesener Zeilen geteilt durch Gesamtzeilen sind gleich Prozent.
Das hilft aber nur bei Textdateien.Anzahl gelesener Zeilen geteilt durch Gesamtzeilen sind gleich Prozent.
Du müsstest aber beliebige Dateien byteweise lesen und jeweils nach 3000 Byte Deine Fortschrittsanzeige aktualisieren.
Byteweise lesen oder schreiben geht nicht mit native Batch.
Mit VBS wäre es noch denkbar, aber auch damit eher Aktion für den Karneval oder einen Schülerwettbewerb.
Grüße
Biber
wär nett wenn du mal dein script wenn es fertig ist veröffentlichst. ich kann mir zwar vorstellen wie es aussieht, aber für kommende personen wäre es toll damit diese es dann nachvollziehen können.
@Biber
Du magst recht haben, aber man kann das nicht verallgemeinern. sobald man eine angabe hat zu der man eine proportion ermitteln kann ist es möglich!
habe dies schon öffter genutzt. und ich dachte auch das es nicht möglich ist im batch mit "grafischen benutzeroberflächen" zu programmieren, habe es (mit sehr sehr viel aufwand) aber hinbekommen. oder mit kommazahlen zu rechenen(ist noch nicht ganz fertig). man muss nur wollen dann findet man meist einen weg. wenn man kompromissbereit ist.
schönen sonntag noch an alle!
gruß erik
Moin erik87 und florengray,
@erik87
Ja. Da liegen wir auch nicht weit auseinander.
In dem o.a. Parallelthread habe ich geschrieben:
Und das zeigt auch das Demo-Beispiel: wenn ich etwas als "100%" definieren kann, wie z.B. die Zeilenanzahl einer Datei oder die Gesamtzahl aller zu kopierenden Dateien (siehe den Hartz4-Laufbalken aus dem o.a. Link), dann kann ich es auch visualisieren.
Was ich NICHT kann ist aber
@florengray
Du als Schuladmin hast bestimmt Verständnis für erzieherische Maßnahmen..
Bitte für das neue Problem "silent/unattended install" entweder die Forumssuche benutzen oder einen neuen Beitrag eröffnen.
Wir haben noch nicht mal alle Punkte aus dieser Titel-Überschrift diskutiert, geschweige denn einen grünen Haken dran.
Grüße
Biber
@erik87
Du magst recht haben, aber man kann das nicht verallgemeinern. sobald man eine angabe hat zu der man eine proportion ermitteln kann ist es möglich!
Ja. Da liegen wir auch nicht weit auseinander.
In dem o.a. Parallelthread habe ich geschrieben:
- wie oben geschrieben - das Werkzeug zur Visualisierung von Prozentangaben ist da. Aber die Prozentangaben nicht.
Und das zeigt auch das Demo-Beispiel: wenn ich etwas als "100%" definieren kann, wie z.B. die Zeilenanzahl einer Datei oder die Gesamtzahl aller zu kopierenden Dateien (siehe den Hartz4-Laufbalken aus dem o.a. Link), dann kann ich es auch visualisieren.
Was ich NICHT kann ist aber
- x Prozent einer Zeitdauer anzeigen, denn ich weiß ja nicht, wie lang es dauert. Siehe M$'s hilflose Versuche bei Installationen. Ist aber weder ein Batch- noch ein M$-Problem.
- x Prozent einer kopierten Datenmenge anzeigen, weil ich eben bestenfalls nach jedem Einzeldatei-Kopieren mal wieder zum Zug komme. Aber eben nicht nach "jeweils 3000 Byte" oder was immer sinnvoll wäre. Und das ist in der Tat ein Batch-Problem. Hab ich nicht bei bei "echten" Programmiersprachen.
@florengray
Du als Schuladmin hast bestimmt Verständnis für erzieherische Maßnahmen..
Bitte für das neue Problem "silent/unattended install" entweder die Forumssuche benutzen oder einen neuen Beitrag eröffnen.
Wir haben noch nicht mal alle Punkte aus dieser Titel-Überschrift diskutiert, geschweige denn einen grünen Haken dran.
Grüße
Biber
hallo biber,
ich denke schon das es möglich ist, während des kopierens auf die datei zuzugreifen. habe es mal ausprobiert. also kann man auch ermitteln wieviel schon geschrieben wurde, wenn man die gesamt menge (wie in diesem fall ) weiß.
habe maöl folgendes gemacht:
::=======================::
::counter1.bat
::=======================::
@echo off
cls
echo.>zahl.dat
start counter2.bat
for /L %%a in (1,1,200000) do (echo %%a >zahl.dat) && (echo %%a)&& (tasklist>tkl.dat)
pause
::================::
::counter2.bat
::================::
@echo off
cls
set start=0
:repeat
for /f %%i in (zahl.dat) do set ist=%%i
if %ist% gtr %start% echo %ist%
set start=%ist%
goto repeat
habe den tasklist>tkl.dat befehl genutzt um mir zeit zu verschafen mit counter2.bat die datei auszulesen. und wenn ich eine variable deklarieren kann, kann ich es also auch summieren.
mit freundlichen grüßen
erik
P.s: ich hoffe du bist nicht verärgert weil ich dir widerspreche....
immerhin kommen einige der besten antworten von dir, und solch eine antwort kann ich irgendwann bestimmt mal wieder gebrauchen..
ich denke schon das es möglich ist, während des kopierens auf die datei zuzugreifen. habe es mal ausprobiert. also kann man auch ermitteln wieviel schon geschrieben wurde, wenn man die gesamt menge (wie in diesem fall ) weiß.
habe maöl folgendes gemacht:
::=======================::
::counter1.bat
::=======================::
@echo off
cls
echo.>zahl.dat
start counter2.bat
for /L %%a in (1,1,200000) do (echo %%a >zahl.dat) && (echo %%a)&& (tasklist>tkl.dat)
pause
::================::
::counter2.bat
::================::
@echo off
cls
set start=0
:repeat
for /f %%i in (zahl.dat) do set ist=%%i
if %ist% gtr %start% echo %ist%
set start=%ist%
goto repeat
habe den tasklist>tkl.dat befehl genutzt um mir zeit zu verschafen mit counter2.bat die datei auszulesen. und wenn ich eine variable deklarieren kann, kann ich es also auch summieren.
mit freundlichen grüßen
erik
P.s: ich hoffe du bist nicht verärgert weil ich dir widerspreche....
immerhin kommen einige der besten antworten von dir, und solch eine antwort kann ich irgendwann bestimmt mal wieder gebrauchen..
@erik87 und @florengray
*lach*
Nein, nein,
bitte missversteht nicht meine nicht-linksrheinisch-herzliche-sondern-eher-humorlose-norddeutsche Art als Übellaunigkeit oder gar den Anspruch, immer im Recht sein zu wollen.
So war es nicht gemeint - ich habe weder die Wahrheit gepachtet noch fühle ich mich zu alt um meine Ansichten zu ändern.
Meine Ansicht war, dass ich im Batch eine "beliebige Portionierung" des Gesamtkuchens, die ich für eine gleitende Darstellung des ProgressBars brauche, im Batch nicht ermitteln kann.
Mit Windowsprogrammen bzw. Objekten, die OnEvent-steuerbar sind ist es sinnvoller.
Die Nutzung des Explorer-ProgressBar z.B. wird auch über so einen OnEvent-Trigger angestoßen.
Die Skizze, die ich oben gepostet habe, bildet diese Mimik auch ab.
Allerdings auf einer eher kindlich-rührenden Ebene.
Vor diesem Hintergrund ist meine Aussage "Laufbalken im Batch ist nicht sinnvoll realisierbar" zu verstehen.
Vor dem Hintergrund einer Wette oder als Kindergeburtstagsgaudi kann man/frau es schon machen.
Grüße
Biber
Stört es denn, wenn wir noch weiter über solche Ladebalken diskutieren?
P.s: ich hoffe du bist nicht verärgert weil ich dir widerspreche....
*lach*
Nein, nein,
bitte missversteht nicht meine nicht-linksrheinisch-herzliche-sondern-eher-humorlose-norddeutsche Art als Übellaunigkeit oder gar den Anspruch, immer im Recht sein zu wollen.
So war es nicht gemeint - ich habe weder die Wahrheit gepachtet noch fühle ich mich zu alt um meine Ansichten zu ändern.
Meine Ansicht war, dass ich im Batch eine "beliebige Portionierung" des Gesamtkuchens, die ich für eine gleitende Darstellung des ProgressBars brauche, im Batch nicht ermitteln kann.
Mit Windowsprogrammen bzw. Objekten, die OnEvent-steuerbar sind ist es sinnvoller.
Die Nutzung des Explorer-ProgressBar z.B. wird auch über so einen OnEvent-Trigger angestoßen.
Die Skizze, die ich oben gepostet habe, bildet diese Mimik auch ab.
Allerdings auf einer eher kindlich-rührenden Ebene.
Vor diesem Hintergrund ist meine Aussage "Laufbalken im Batch ist nicht sinnvoll realisierbar" zu verstehen.
Vor dem Hintergrund einer Wette oder als Kindergeburtstagsgaudi kann man/frau es schon machen.
Grüße
Biber
@florengray
was willst du denn genauer erläutert haben? stört nicht, dafür ist dieses forum da!
p.s.: wenn es klappt können wir ja den kasten gemeinsam killen...
@Biber
*relach*
coole verbalkonstruktion diese "nicht-linksrheinisch-herzliche-sondern-eher-humorlose-norddeutsche Art"
ok, dann sind wir uns ja einig das es möglich ist aber mit anderen windowsprogrammen besser und vorallendingen einfacher zu realisieren ist.
was willst du denn genauer erläutert haben? stört nicht, dafür ist dieses forum da!
p.s.: wenn es klappt können wir ja den kasten gemeinsam killen...
@Biber
*relach*
coole verbalkonstruktion diese "nicht-linksrheinisch-herzliche-sondern-eher-humorlose-norddeutsche Art"
ok, dann sind wir uns ja einig das es möglich ist aber mit anderen windowsprogrammen besser und vorallendingen einfacher zu realisieren ist.
Moin, erik87,
Lass uns da Plan A und Plan B draus machen.
Mit VBS würde ich eine ganz andere Strategie und vor allem auch eine reine VBS-Lösung anstreben.
Lieber erstmal zu Plan A: Alles (außer Brotschneiden) geht per Batch.
Ein Beispiel für "Stringlänge einer Zeile ermitteln" habe ich irgendwo in einem der Batch-Tuts verwendet.
Bekomme ich aber zur Not auch stehend freihändig wieder zusammen.
Wenn wir im obigen Beispiel
Aktuelle Größe einer Datei --> = Dateigröße, haben wir.
Die gelesenen (oder geschriebenen) Bytes können wir ermitteln.
Wir erweitern die FOR-Anweisung oben um einen zweiten Parameter "%%j":
und etwas tiefer ermitteln wir die Länge dieser Zeile "%%~j"...
[Ungetestete Skizze]
Dieses Beispiel würde jetzt einen Balken für EINE Datei malen, aber die Umstellung auf Einen-Bar-für-alle-Dateien ist nunKasperkram lösbar.
Grüße
Biber
Das mit dem Datenstrom geht wohl kaum, aber vielleicht gibt es andere Möglichkeiten.
Ich könnte auch *.vbs mit *.bat verbinden
Ich könnte auch *.vbs mit *.bat verbinden
Lass uns da Plan A und Plan B draus machen.
Mit VBS würde ich eine ganz andere Strategie und vor allem auch eine reine VBS-Lösung anstreben.
Lieber erstmal zu Plan A: Alles (außer Brotschneiden) geht per Batch.
Ein Beispiel für "Stringlänge einer Zeile ermitteln" habe ich irgendwo in einem der Batch-Tuts verwendet.
Bekomme ich aber zur Not auch stehend freihändig wieder zusammen.
Wenn wir im obigen Beispiel
- nicht die Anzahl Zeilen (pro Datei oder Summe aller Dateien) und die AktuelleZeile miteinander in Beziehung setzen,
- sondern die Gesamtgröße (pro Datei oder Summe aller Dateien) und die AktuellGelesenenBytes,
Aktuelle Größe einer Datei --> = Dateigröße, haben wir.
Die gelesenen (oder geschriebenen) Bytes können wir ermitteln.
Wir erweitern die FOR-Anweisung oben um einen zweiten Parameter "%%j":
...
For %%i in ("%testdatei%") do set AllLinesSize=%%~zi
Set /a BytesAbgefackelt=0
For /f "delims=: tokens=1,*" %%i in ('findstr /n $ "%testdatei%"') do call :ProgressPerc %%i "%%j"
...
:ProgressPerc
echo "~%2">%temp%\OneLine.txt
For %%i in ("%temp%\OneLine.txt") do set /a ThisLineSize=%%~zi -4
Set /a BytesAbgefackelt+=ThisLineSize
REM ###alte Zeile### set /a Percent=(%1*100) / lines
REM neue Variante
set /a Percent=(BytesAbgefackelt*100) / AllLinesSize
set /a BarLen= percent / 2
Cls
REM echo Line %1 of %lines% = %percent%%% ###alte Zeile ###
echo %BytesAbgefackelt% of %AllLinesSize% = %percent%%%
REM .....Rest bleibt wie vorher
echo !Bar:~0,%BarLen%!
for /l %%x in (1,1,2000) do set "dummy="
goto :eof
Dieses Beispiel würde jetzt einen Balken für EINE Datei malen, aber die Umstellung auf Einen-Bar-für-alle-Dateien ist nun
Grüße
Biber
Hallo florengray!
Bis Biber dazu kommt, könnte ja ich mich ein wenig im Erklären versuchen - er stellt's dann schon richtig, keine Sorge ...
Grüße
bastla
Bis Biber dazu kommt, könnte ja ich mich ein wenig im Erklären versuchen - er stellt's dann schon richtig, keine Sorge ...
Wo werden die abgefakelten Bytes gelesen?
Da eine Len()-Funktion zum Abzählen der Zeichen einer Zeile in Batch nun wirklich nicht vorhanden ist, wird die einzelne Zeile in eine Temporärdatei geschrieben ("%temp%\OneLine.txt") und die Länge über die Dateigröße in Byte (%%~zi) bestimmt. Der Overhead von 4 Zeichen ergibt sich aus den beiden Anführungszeichen und dem vom "echo" zusätzlich geschriebenen CR/LF.müsste nicht
War mir auch neu. Dass es so funktioniert erkläre ich mir damit, dass, bedingt durch den Schalter "/a", ja ohnehin nur Zahlenwerte im Rest der Zeile erwartet und demnach die Variablennamen auch als solche und nicht als Text interpretiert werden.set /a Percent=(BytesAbgefackelt*100) / AllLinesSize
so aussehen:set /a Percent=(%BytesAbgefackelt%*100) / %AllLinesSize%
was da abgefakelt wird und wie?
Abgefackelt wird die Gesamtzahl an Bytes (=Gesamtgröße der Datei wie oben mit "set AllLinesSize=%%~zi" ausgelesen und gespeichert) durch Verarbeiten der einzelnen Zeilen, deren jeweilige Größe in Bytes wie vorhin beschrieben ermittelt werden kann - damit gibt es zwei Zahlenwerte ("Bytes gesamt" und "Bytes bisher verarbeitet"), die zueinander in Beziehung gesetzt werden können.Und was ist das $
Das "findstr /n" hat den Zweck, jede einzelne Zeile (inkl Leerzeilen) zu erfassen, indem die Zeile eine Nummer vorangestellt bekommt. Damit auch jede Zeile gefunden wird, muss ein passender Suchbegriff (der immer vorkommt) verwendet werden: das Zeilenende ($) - wenn Du's hübscher (oder sicherer, falls die letzte Zeile nicht mit CR/LF enden sollte) findest, kannst Du auch den Zeilenanfang nehmen (^^).und ('...')
Das Einschließen in "einfache Anführungszeichen" zeigt an, dass nicht der Inhalt einer Datei, sondern die Ausgabe einer Anweisung, hier also "findstr", durch die "for"-Schleife ausgelesen werden soll.und ("%testdatei%") ?? leerzeichen sind da doch nirgends???
Hilft's nicht, schadet's nicht, oder auch: Vorsicht ist die Mutter dieses Behälters mit den Tupperware-Vorgängern - falls sich in den Pfad oder Namen der Testdatei doch einmal Leerzeichen eingeschlichen haben sollten, wirst Du über diese 2 zusätzlichen Bytes froh sein.+= ist eine Zuordnung soweit ich das verstanden habe aber ist das = nicht dasselbe hier?
Mit "+=" wird eine Addition "in die Variable" durchgeführt - hier erhöht sich dadurch also die Zahl der "BytesAbgefackelt" um "ThisLineSize". Ausgeschrieben sähe das so aus: "Set /a BytesAbgefackelt=BytesAbgefackelt+ThisLineSize"Grüße
bastla
Dickes Danke, bastla,
im geduldigen Erklären bist Du wohl besser als ich...
Ich hätte es trotzdem versucht, war aber in der Tat die letzten paar 100 Minuten nicht am Rechner, sondern in der Küche.
Davon versteh ich wenigstens etwas... und lieber hier im Forum brennt etwas an, als dass ich mein Essen auf zu kleiner Flamme köcheln lassen muss.
Eine Ergänzung noch zu den "Variablen ohne %-Zeichen in der SET /A-Anweisung":
M$ ist ja so ein hinterhältiges Unternehmen, die halten nicht nur Informationen zurück, nein,
die verstecken das in ihren Dokumentionen!.
Da wird jeder normale Mensch zehnmal drüber weglesen, aber folgendes steht in der Hilfe zu SET am CMD-Prompt:
[Ggf mehrmals lesen]
Gesehen? "Somit können Sie mit Umgebungsvariablen Berechnungen vornehmen, ohne %-Zeichen einzugeben,.
Echt hinterhältig, sowas. Saubazis, amerikanische.
Und eine Korrektur noch in der Laufbalkensimulations-Skizze oben:
Besser ich oben nach. OMG, wass'n Deutsch!! Ich meinte: Ich bessere das oben nach.
Grüße
Biber
im geduldigen Erklären bist Du wohl besser als ich...
Ich hätte es trotzdem versucht, war aber in der Tat die letzten paar 100 Minuten nicht am Rechner, sondern in der Küche.
Davon versteh ich wenigstens etwas... und lieber hier im Forum brennt etwas an, als dass ich mein Essen auf zu kleiner Flamme köcheln lassen muss.
Eine Ergänzung noch zu den "Variablen ohne %-Zeichen in der SET /A-Anweisung":
M$ ist ja so ein hinterhältiges Unternehmen, die halten nicht nur Informationen zurück, nein,
die verstecken das in ihren Dokumentionen!.
Da wird jeder normale Mensch zehnmal drüber weglesen, aber folgendes steht in der Hilfe zu SET am CMD-Prompt:
Set /?
.....
Wenn Sie einen der arithmetischen oder Moduloperatoren verwenden, müssen
Sie die Zeichenfolge für den Ausdruck in Anführungszeichen setzen. Alle
nicht-nummerischen Zeichenfolgen im Ausdruck werden als Zeichenfolgen von
Umgebungsvariablen behandelt, deren Werte vor der Verwendung in Zahlen
konvertiert werden. Wenn eine Umgebungsvariable angegeben wird, die nicht
definiert ist, wird für diese der Wert Null verwendet. Somit können Sie
mit Umgebungsvariablen Berechnungen vornehmen, ohne %-Zeichen einzugeben,
um deren Werte zu erhalten. Wenn der Befehl SET /A von der Befehlszeile,
d.h. außerhalb eines Befehlsskripts ausgeführt wird, dann zeigt er
den endgültigen Wert des Ausdrucks an. Der Zuordnungsoperator erfordert
....
Gesehen? "Somit können Sie mit Umgebungsvariablen Berechnungen vornehmen, ohne %-Zeichen einzugeben,.
Echt hinterhältig, sowas. Saubazis, amerikanische.
Und eine Korrektur noch in der Laufbalkensimulations-Skizze oben:
...
REM neue Variante
set /a Percent=(BytesAbgefackelt*100) / AllLinesSize
REM .....Rest bleibt wie vorher
set /a BarLen= percent / 2
Cls
REM #### echo Line %1 of %lines% = %percent%%% ############# Zeile muss auch geändert werden
echo %BytesAbgefackelt% of %AllLinesSize% = %percent%%%
Grüße
Biber
@bastla
Und dabei habe ich die anderen versteckten Infos noch gar nicht breitgetreten (wenn auch mitgepostet)...
Oder kennst Du irgendjemand, der schon jemals die folgende Syntax gelesen oder gar benutzt hat..?
Steht in den ersten geposteten Zitatzeilen.
Und es funktioniert auch noch! *kopfschüttel*...
Und unsereins bricht sich einen ab mit
Grüße
Biber
Und dabei habe ich die anderen versteckten Infos noch gar nicht breitgetreten (wenn auch mitgepostet)...
Oder kennst Du irgendjemand, der schon jemals die folgende Syntax gelesen oder gar benutzt hat..?
Steht in den ersten geposteten Zitatzeilen.
set /a 1000 ">>" 3
Und unsereins bricht sich einen ab mit
set /a 1000 ^>^> 3
Grüße
Biber
@Biber
Die Frage, wann ich auf
zurückgreifen müsste, hatte ich mir zwar schon kurz gestellt, aber für einen Antwortversuch war's mir dann doch gestern schon zu spät heute noch zu früh.
Grüße
bastla
Oder kennst Du irgendjemand, der schon jemals die folgende Syntax gelesen oder gar benutzt hat..?
Jedenfalls was mich angeht: weder die eine noch die andere (Bitschiebereien mache ich denn doch eher selten - wann war doch gleich das letzte Mal - und dann in einer anderen Sprache).Die Frage, wann ich auf
... müssen Sie die Zeichenfolge für den Ausdruck in Anführungszeichen setzen.
Grüße
bastla
@bastla
So, jetzt haben wir aber genug rumgealbert, jetzt können erstmal florengray und erik87 wieder etwas Ernsthaftes tippseln.
...irgendwas Unangenehmes war doch heute...*grübel*....ach ja: Montach!
Grüße
Biber
Bitschiebereien mache ich denn doch eher selten...
Ich schiebe auch lieber Becks als Bit... So, jetzt haben wir aber genug rumgealbert, jetzt können erstmal florengray und erik87 wieder etwas Ernsthaftes tippseln.
...irgendwas Unangenehmes war doch heute...*grübel*....ach ja: Montach!
Grüße
Biber
holla hier hat sich ja in den paar stunden ne menge getan.
@ biber,
schön mal zuwissen warum man keine %-zeichen beim set /a befehl brauch. von wo hast du das zitiert?? find ich das bei mir auf dem rechner auch? gibt bestimmt noch mehr interessanter dinge zu lernen von wo auch immer du das her hast.
hmm morgen ist noch was viel unangenehmeres.... : Dienstag
@ florengray,
wenn alles gesagt wurde, was ja schon gesagt wurde, dann gib doch nochmal einen feedback und/oder mach ein häckchen! (ich hasse es forenbeiträge beantwortet, person meldet sich nicht mehr, ewig offen.... und unser einer ließt die überschrift und denkt ist nicht gelöst....)
::Das ist Dönekens, wenn de leute sowas machen.
::auch wenn ich nicht weiß was Dönekens ist...
@ biber,
schön mal zuwissen warum man keine %-zeichen beim set /a befehl brauch. von wo hast du das zitiert?? find ich das bei mir auf dem rechner auch? gibt bestimmt noch mehr interessanter dinge zu lernen von wo auch immer du das her hast.
hmm morgen ist noch was viel unangenehmeres.... : Dienstag
@ florengray,
wenn alles gesagt wurde, was ja schon gesagt wurde, dann gib doch nochmal einen feedback und/oder mach ein häckchen! (ich hasse es forenbeiträge beantwortet, person meldet sich nicht mehr, ewig offen.... und unser einer ließt die überschrift und denkt ist nicht gelöst....)
::Das ist Dönekens, wenn de leute sowas machen.
::auch wenn ich nicht weiß was Dönekens ist...
Moin florengray,
vielen Dank für Deine Verfeinerungen.
Mir blieb eben nicht mehr zu tun, als Deine -Blöcke in ebensolche Tags zu betten.
Deshalb habe ich Deine beiden Vor-Kommentare editiert, aber keinerlei Änderungen vorgenommen.
Den sporadischen Fehler mit "set /p ...<=..." muss ich mir mal in Ruhe anschauen.
Ich werde mal bei Gelegenheit (evtl. während mein Weihnachts-Vendaloo diese 3 Stunden vor sich hinsimmert? *grübel*) versuchen, diesen Fehler mit Deinem Beispielskript zu reproduzieren.
Wenn es klappt, verklagen wir M$ und von meiner Hälfte des Streitwerts kaufe ich mir so ein blondes Thomas-Gottschalk-Haarimplantat. Oder gönne mir etwas anderes Perverses, mal sehen. Vielleicht was Rothaariges...
Anyhow, bei künftigen Fragen zu "Fortschrittsbalken mit Batch" werde ich auf diesen schönen Gemeinschaftsthread verweisen.
Grüße
Biber
vielen Dank für Deine Verfeinerungen.
Mir blieb eben nicht mehr zu tun, als Deine -Blöcke in ebensolche Tags zu betten.
Deshalb habe ich Deine beiden Vor-Kommentare editiert, aber keinerlei Änderungen vorgenommen.
Den sporadischen Fehler mit "set /p ...<=..." muss ich mir mal in Ruhe anschauen.
Ich werde mal bei Gelegenheit (evtl. während mein Weihnachts-Vendaloo diese 3 Stunden vor sich hinsimmert? *grübel*) versuchen, diesen Fehler mit Deinem Beispielskript zu reproduzieren.
Wenn es klappt, verklagen wir M$ und von meiner Hälfte des Streitwerts kaufe ich mir so ein blondes Thomas-Gottschalk-Haarimplantat. Oder gönne mir etwas anderes Perverses, mal sehen. Vielleicht was Rothaariges...
Anyhow, bei künftigen Fragen zu "Fortschrittsbalken mit Batch" werde ich auf diesen schönen Gemeinschaftsthread verweisen.
Grüße
Biber
[OT] @florengray
Dein Zitat ist eine abgewandelte Regel aus Murphys Computergesetzen.
Der Rausch der Geschwindigkeit:
Mit Computern lassen sich viele Dinge mit atemberaubender Geschwindigkeit erledigen, die eigentlich überhaupt nicht getan werden müssten.
Daraus folgt:
Gesetze der Computer-Programmierung
Die Komplexität eines Programms wächst so lange, bis sie die Fähigkeit des Programmierers übertrifft, der es weiterführen muß.
[/OT]
Hehehe.
Dein Zitat ist eine abgewandelte Regel aus Murphys Computergesetzen.
Der Rausch der Geschwindigkeit:
Mit Computern lassen sich viele Dinge mit atemberaubender Geschwindigkeit erledigen, die eigentlich überhaupt nicht getan werden müssten.
Daraus folgt:
Gesetze der Computer-Programmierung
Die Komplexität eines Programms wächst so lange, bis sie die Fähigkeit des Programmierers übertrifft, der es weiterführen muß.
[/OT]
Hehehe.