florengray
Goto Top

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

Content-ID: 74358

Url: https://administrator.de/contentid/74358

Ausgedruckt am: 25.11.2024 um 08:11 Uhr

36539
36539 23.11.2007, aktualisiert am 18.10.2012 um 18:32:43 Uhr
Goto Top
@florengray

Fortschrittsbalken für Batch nicht wirklich möglich - wurde hier schon mehrfach besprochen.
Fortschrittanzeige bei batch bzw batchkopiervorgang

gruß
onegasee59
erik87
erik87 24.11.2007 um 18:10:05 Uhr
Goto Top
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. face-big-smile
gruß erik
florengray
florengray 24.11.2007 um 19:30:37 Uhr
Goto Top
Ja so in ungefähr sehen meine Balken auch aus.

@echo off

set counter=0
set pa=0
set max=50000

:Überprüfung
if %counter%==%max% goto max
if %counter%==%pa% goto pa

:next_counter
set /a counter=%counter%+100
goto Überprüfung

:pa
set x=%pa:~0,1%
for %%a in (%x%) do set y=%y%+
cls
rem 50 Zeichen --> max=50000
echo #############################################
echo %y%
echo #############################################

set /a pa=%pa%+1000
goto next_counter

:max
echo Daten vollständig angelegt.
pause

Das ist die (einfache) Lösung.
Ich hab noch ne zweite, der Code ist aber sehr lang.

Mein Problem ist jetzt nur, dass ich beim Dateien anlegen die Dateien nicht zählen wollte und dann nach jeder erfolgreich angelegten Datei den Balken um ein paar Einheiten nach rechts schiessen lassen wollte, sondern vielleicht die Zeichenanzahl, die angelegt wird, (ist ja ne Datei nur feiner) in diesen Code anstatt der Counterschleife einbauen wollte.
Nur ich weiss nicht wie???
Und ich wollte nicht nach jeden Zeichen in meinem richtigen Code eine Balkenschleife einbauen.
Das kann bei einer Batch, die so um die 500 Kb gross wird dann sehr unübersichtlich werden.

Also ich wiess wieviel Zeichen dann angelegt werden müssten. Das könnte ich per Word rauskriegen.
Das ist nicht schwer.
Aber dass dann mit dem Datenstrom zu verbinden, dass ist schwer!
Hab noch keine Ahnung wie das gehen soll.

Wir können mal als Beispiel annehmen, dass ca 12 Dateien a 3000 Zeichen angelegt werden müssten.
Das macht dann nach Adam Riese: 36000 Zeichen.
Man könnte jetzt natürlich das als max für den Counter angeben, aber wenn eine Datei "hängt" läuft der Balken weiter.....
Ich wollte das mit dem Balken in Abhängigkeit zur Zeichenanzahl setzen.
Wenn du einen anderen Vorschlag hast kannst du meinen Code auch abändern.

Verstehst du was ich meine?
36539
36539 24.11.2007 um 20:34:26 Uhr
Goto Top
@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
florengray
florengray 24.11.2007 um 23:36:33 Uhr
Goto Top
Link habe ich schon vorher gelesen.
Gerade nochmals.

!Unabhängig!< zum Ladebalken:
Wie kann ich die "verarbeitete" Zeichenanzahl in einer Variable speichern?
Meinetwegen 35000 Zeichen und die werden "kopiert".
Wie kann ich das dann in einer Variable speichern: 1 Zeichen verarbeitet, 2 Zeichen, 3, 4, 5, 6, ...
Wäre schön wenn man mir vielleicht einen Ansatz skizzieren könnte.

Florengray
erik87
erik87 25.11.2007 um 00:22:08 Uhr
Goto Top
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
Biber
Biber 25.11.2007 um 03:50:24 Uhr
Goto Top
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:
::-----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
Output:
$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%
?????????????
..und am Ende etwa so etwas:
Line 158 of 158 = 100%
??????????????????????????????????????????????????
Drücken Sie eine beliebige Taste . . .
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.
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.
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
florengray
florengray 25.11.2007 um 12:16:56 Uhr
Goto Top
Hallo,
genau das habe ich gesucht!
Vielen, vielen Dank dafür !und !
tut mir leid, das ist dieses "brisante" Thema angesprochen habe.
Soll nicht wieder vorkommen.

Aber dennoch vielen Dank!

florengray
erik87
erik87 25.11.2007 um 12:45:28 Uhr
Goto Top
face-smile

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.
face-big-smile

schönen sonntag noch an alle!
gruß erik
florengray
florengray 25.11.2007 um 13:24:57 Uhr
Goto Top
Nochmals Hallo,
also ich wollte mit Batch eine komplette Programminstallation unter XP realisieren.
In meiner Schule beschweren die sich alle, das wenn sie ihr System zu Schrott gefahren haben, dass die dann formatieren müssen, dabei dann noch Probleme haben und dann wieder alle Programme aufspielen müssen und dann noch das Wochende futsch ist.
Ich habe gesagt, das man nicht am System herumspielen sollte, außer man wiess was man tut und dann, wenn man es nicht lassen kann, Backupprogramme nutzen sollte. Ich habe 5 versch. Programme aufgezählt, die ihren Job gut machen.
Das wollten aber viele nicht, da man ja Zeit investieren muss um diese Backups zu brennen und anzulegen....
Kann ich nicht ganz nachvollziehen, da es sowas wie Taskmamager gibt und natürlich auch die Batch.
Dann haben die gefragt was Batch ist!!!!!!!
War total baff.
Spielen am System herum und kenne keine Batch!?!?!?
Ich habe gesagt, dass man damit sehr viele Sachen am PC automatisieren könnte.
Frage von den anderen: Theoretisch auch alle Programme von alleine installieren lassen?
Batch anklicken und die Mühle über Nacht schuften lassen?
Am nächten Morgen alles fein sauber installiert?
Hab gesagt, dass das auch theoretisch möglich sei.
Wollte man mir nicht glauben und nun progge ich jetzt diese Batch.
Als Wette ´n schöner Kasten Bier.

Hab schon ein Grundgerüst!
Muss nur *.vbs wegen Sendkeys miteinbringen.
Außer es gibt eine Möglichkeit "Sendkeys" per Batch zu realisieren ?

Klingt vielleicht idiotisch aber ich muss den Ruf der Batch verteidigen.

schönen Sonntag noch.
Biber
Biber 25.11.2007 um 13:39:07 Uhr
Goto Top
Moin erik87 und florengray,

@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..face-wink
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
erik87 25.11.2007 um 15:22:04 Uhr
Goto Top
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.. face-big-smile
florengray
florengray 25.11.2007 um 15:44:04 Uhr
Goto Top
Naja,
is halt eben nur ne Wette.
Eigentlich wollte ich ja gar nicht schreiben, dass ich eine solche install.
machen will.
So im Ganzen sind aber meine Fragen gelöst.
(Ich hab so im ungefähren eine Ladebalken.)
Nur jetzt interressiert mich natürlich, wie ich die geschrieben Datenmenge "auslesen" kann.
Vielleicht habe ich das aber noch nicht richtig verstanden was erik87 da gemacht hat.?

Stört es denn, wenn wir noch weiter über solche Ladebalken diskutieren?
Denn sonst wären meine Fragen gelöst.

Ich hätte sonst nämlich noch Fragen zu dem was erik87 da gemacht hat.

Schönen Sonntag euch allen!
Biber
Biber 25.11.2007 um 16:06:10 Uhr
Goto Top
@erik87 und @florengray

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
erik87
erik87 25.11.2007 um 16:56:54 Uhr
Goto Top
@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... face-big-smile

@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.
florengray
florengray 25.11.2007 um 18:05:10 Uhr
Goto Top
Na super!
Ok, dachte ich hätte da irgendwas geweckt, was nicht hätte geweckt werden sollen.

@erik87 und alle anderen:
Wenn man Dateien anlegt, in meinem Beispiel werden von meiner Hauptbatch die Installationsroutinen (auch *.bat) angelegt. Die sind sehr groß und von der Struktur sehr umfangreich. Davon werden dann ganze 20 angelegt.
Diese werden wiederum von anderen "System"batches nacheinander in den Autostartordner kopiert und dann beim nächsten Sysstart ausgeführt.
Ziel: Alle Programme wie Office, Outlook, True Crypt,... werden installiert ohne das man dabei sitzen muss.
Ich gebe zu, dass man das auch anders lösen kann, aber es geht ja um die Batch im Allgemeinen.
So, da das jetzt "lange" dauert, bis die Routinen angelegt sind, wollte ich dafür einen "geschmeidig" laufenden Balken proggen.
Dazu muss ich aber wissen, wie ich prozentual die verarbeitete Zeichenanzahl oder Zeilen (biber) in den Balken einbringen kann.
Ich dachte man könnte sowas wie den Datenstrom anzapfen und dann die vorbeilaufende Zeichenanzahl ermitteln und dann das als "variable" gehaltenen Wert zu dem festen Wert prozentual in Verbindung setzen.
Das könnte man wiederum visuell umsetzen.

Verständlich?
Das mit dem Datenstrom geht wohl kaum, aber vielleicht gibt es andere Möglichkeiten.
Ich könnte auch *.vbs mit *.bat verbinden.?
Biber
Biber 25.11.2007 um 18:31:12 Uhr
Goto Top
Moin, erik87,

Das mit dem Datenstrom geht wohl kaum, aber vielleicht gibt es andere Möglichkeiten.
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,
dann passt es doch schon.

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"  
und etwas tiefer ermitteln wir die Länge dieser Zeile "%%~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
[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 nun Kasperkram lösbar.

Grüße
Biber
florengray
florengray 25.11.2007 um 19:42:55 Uhr
Goto Top
Also, danke erstmal
aber befor ich das teste
was macht das da????
Ich hab ja schon ein bisssssschen Ahnung, aber das geht doch zu weit für mich.
Wo werden die abgefakelten Bytes gelesen?
und müsste nicht
set /a Percent=(BytesAbgefackelt*100) / AllLinesSize
so aussehen:
set /a Percent=(%BytesAbgefackelt%*100) / %AllLinesSize% ???
kann sich aber mit enableDelayedExpansion ändern.
Weis ich nicht genau.
Aber könntest du mir erklären, was da abgefakelt wird und wie?
Und was ist das $ und ('...') und ("%testdatei%") ?? leerzeichen sind da doch nirgends???
das mit delims und tokens geht für mich noch.
+= ist eine Zuordnung soweit ich das verstanden habe aber ist das = nicht dasselbe hier?

Nur wenn du Lust hast.

Aber sonst herzlichen Dank und noch nen schönen Sonntag Abend.

florengray
bastla
bastla 25.11.2007 um 22:48:21 Uhr
Goto Top
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 ... face-wink

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
set /a Percent=(BytesAbgefackelt*100) / AllLinesSize
so aussehen:
set /a Percent=(%BytesAbgefackelt%*100) / %AllLinesSize%
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.

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 face-wink - 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
Biber
Biber 25.11.2007 um 23:39:07 Uhr
Goto Top
Dickes Danke, bastla,

im geduldigen Erklären bist Du wohl besser als ich... face-wink

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
....
[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:
...
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%%%

Besser ich oben nach. OMG, wass'n Deutsch!! Ich meinte: Ich bessere das oben nach.

Grüße
Biber
bastla
bastla 26.11.2007 um 00:23:31 Uhr
Goto Top
Hallo Biber!

Eine elegantere elaborierte Fassung eines lapidaren "RTFM" habe ich ja nun wirklich noch nicht gesehen face-wink - da fällt es gleich viel leichter, zu akzeptieren, dass Du damit leider Recht hast.

Grüße
bastla
Biber
Biber 26.11.2007 um 00:36:13 Uhr
Goto Top
@bastla

face-big-smile
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 es funktioniert auch noch! *kopfschüttel*...
Und unsereins bricht sich einen ab mit
set /a 1000 ^>^> 3

Grüße
Biber
bastla
bastla 26.11.2007 um 06:42:10 Uhr
Goto Top
@Biber

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 face-wink - und dann in einer anderen Sprache).

Die Frage, wann ich auf
... müssen Sie die Zeichenfolge für den Ausdruck in Anführungszeichen setzen.
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
Biber
Biber 26.11.2007 um 07:59:26 Uhr
Goto Top
@bastla
Bitschiebereien mache ich denn doch eher selten...
Ich schiebe auch lieber Becks als Bit... face-wink

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
erik87
erik87 26.11.2007 um 15:08:46 Uhr
Goto Top
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. face-smile

hmm morgen ist noch was viel unangenehmeres.... : Dienstag face-big-smile

@ 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... face-big-smile
florengray
florengray 26.11.2007 um 15:13:48 Uhr
Goto Top
Mein Abschlusskommentar ist weg!!!

Hab gerade den noch geschrieben, dann auf senden gedrückt und dann war alles weg!! Wäääääääääääääähähähä!
Naja. Bis jetzt scheint alles gelöst zu sein.
Könnt nen Hacken machen und oder schließen ,archivieren, brennen, sichern, was auch immer ihr wollt.

Danke vielmals an Alle!!!!!!!!!
Ich schieb euch ´n Bytebier durch die Leitung!
Bis dann!
florengray
erik87
erik87 26.11.2007 um 15:15:21 Uhr
Goto Top
na dann prost! face-big-smile
florengray
florengray 09.12.2007 um 17:55:33 Uhr
Goto Top
Ich setze mal hier wieder an:

Also ich habe deine Lösung im Grunde so gelassen.

außer:
For /f "delims=: tokens=1,*" %%i in ('findstr /n $ "%testdatei%"') do echo %%i >> %output% & call :ProgressPerc %%i  
%output% ist hier die Datei, die dann angelegt wird.

Und am Ende habe ich noch if Schleifen eingebaut, die eigentlich nur dolgende Aufgabe haben:
Es kam bei mir vor, dass ich manchmal nur 97% angezeigt vekam, obwohl die Datei zu 100% verarbeitet wurde?
Es kam bei mir auch vor, dass 1289 von 1275 Bytes angezeigt wurde und damit auch 101%???
Und dann noch eine Fehlermeldung, wenn in der Datei, die ich verarbeiten wollte, die Zeilen
vorkam: set /p x=<xyz.txt

Das < ist Schuld. Habe ich durch ausprobieren herausgefunden.
Vermeiden lässt sich das durch : for %%a in ('type Datei.txt') do set x=%%a
Aber auch nur da in ca. 23 von 25 Fällen.

Also: Problem a: Wie kriegt man das Under- Overhead in den Griff?
Problem b: Woher kommen diese Fehlermeldungen? Die Zeilen werden doch nur als "Text" verarbeitet/interpretiert!?!?
Fehlermeldung: "Das System kann die angegebene Datei/Pfad nicht finden."

Ich habe mir erlaubt auch mal einen Code zu schreiben, natürlich auf deinem basierend:
@echo off & setlocal EnableDelayedExpansion
rem Anzahl der verarbeiteten Bytes vB=0
set vB=0
rem Gesamtgrösse aller Einzelzeilen seZ
set seZ=0

rem Gesamtgrösse der Datei: SD= Size Datei
for %%a in (Datei.txt) do set SD=%%~za

rem Grösse jeder Zeile ermitteln Teil A:
for /f "delims= tokens=1*" %%c in (Datei.txt) do echo %%c >tmp.txt & call :B  
pause

:B
rem Grösse der einzelnen Zeile ermitteln Teil B: SL=Size einzelne Line
for %%b in (tmp.txt) do set SL=%%~zb
set /a seZ+=%SL%

rem verarbeitete Prozent errechnen:
set /a percent=(%seZ%*100) / %SD%

rem 50 Barzeichen--> 1 Barzeichen = 2% --> Percent / 2 = Anzahl der Barzeichen
set bar=##################################################

rem Umrechnung von % auf barlen Barlänge
set /a barlen=%percent% / 2

cls

echo %seZ% Bytes von %SD% Bytes ## %percent%%% -- 100%%
echo %bar%
echo !bar:~0,%barlen%!
echo %bar%
Das mit dem Under- Overhead habe ich durch eine sinnlose Ehrenrunde "behoben".
Ich lasse die Datei einfach vorher zerstückeln und ermittle die Grösse der verarbeiteten Zeilen. Das ist dann die Grösse der "Datei".
Code:
rem Dateigrösse:
echo Datei wird analysiert...
for /f "delims= tokens=1*" %%d in (Datei.txt) do echo %%d >SD.txt & call :C  
goto weiter
:C
for %%e in (SD.txt) do set SDtmp=%%~ze
set /a SD+=%SDtmp%
goto :eof
anstatt
rem Gesamtgrösse der Datei: SD= Size Datei
for %%a in (Datei.txt) do set SD=%%~za

Dann stimmt Alles. Kostet aber Zeit.
Frage was sagt du dazu? Und kann man das mit den "in die Datei schreiben" um die Grösse der einzelnen Zeilen zu ermitteln, nicht irgendwie gleich in der For erledigen?

Ansonsten Danke nochmals!!!!
florengray
florengray 09.12.2007 um 23:58:46 Uhr
Goto Top
Also hier kommt ein Update:
Ist stabiler etwas schneller, Bild läuft ruhiger, ´n bisschen mehr Comfort und KrimsKram.

@echo off & setlocal EnableDelayedExpansion

rem Alle Dateinamen müssen 7 Buchstaben haben.

set bargestmp=1

for %%a in (%Datei%) do set Datei=%%a & call :calc
for /l %%x in (1,1,2000)do echo %%x >nul
goto :eof

:calc
set vB=0
set seZ=0
:: echo %Datei% wird analysiert...
for /f "delims= tokens=1*" %%b in (%Datei%) do echo %%b >SD.txt & for %%c in (SD.txt) do set SDtmp=%%~zc & call :A  
goto progress
:A
set /a SD+=%SDtmp%
goto :eof

:progress
for /f "delims= tokens=1*" %%d in (%Datei%) do echo %%d >>%Datei:~0,10%.bat & echo %%d >eZ.txt & for %%e in (eZ.txt) do set eZ=%%~ze & call :B  
del SD.txt
del eZ.txt
set SD=
set /a bargestmp+=%barlenges%
goto :eof

:B
set /a seZ+=%eZ%
set /a percent=(%seZ%*100) / %SD% 
set bar=##################################################
set /a barlen=%percent% / 2
set /a barlenges=%percent% / 14
set /a barges=%barlenges% + %bargestmp%
set /a percentges=%barges% * 2
cls
:: Output: %Datei:~0,10%.bat
echo %Datei%    %percent%%% -- 100%% 
echo ##################################################
echo !bar:~0,%barlen%!
echo ##################################################
echo.
echo Gesamtverlauf:
echo             %percentges%%% --100%%
echo ##################################################
echo !bar:~0,%barges%!
echo ##################################################
goto :eof
Es können unendlich viele Dateien per Aufruf übergeben werden, wobei alle Dateiinhalte als
Batch ausgegeben werden und zusätzlich noch der Gesamtverlauf der Aktion visuell dargestellt wird. Aber nur für 7 Dateien!
Wer mehr oder weniger hat muss:
...
set /a barlenges=%percent% / 14
set /a barges=%barlenges% + %bargestmp%
set /a percentges=%barges% * 2
...
neu dimensionieren.

Ich denke das ist das non plus Ultra, was man bei einem Batch Fortschrittsbalken rausholen kann.

Ich bin soweit zufrieden.

Wer Verkürzungen , Verbesserungen oder Fragen hat, soll das tun.

Ansonsten schönen 9.12. noch.


PS: Computer lösen Probleme, die wir ohne sie gar nicht hätten.
Hab leider den Autor vergessen.
Biber
Biber 10.12.2007 um 06:59:08 Uhr
Goto Top
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
58502
58502 10.12.2007 um 11:54:53 Uhr
Goto Top
[OT] @florengray
Dein Zitat ist eine abgewandelte Regel aus Murphys Computergesetzen. face-wink

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. face-smile
florengray
florengray 10.12.2007 um 15:05:32 Uhr
Goto Top
Die Sürche sind gut! *lach*
Ich meine Sprüche.

@Biber
Da du KEINE spontane Antwort auf das Phänomen weisst, gehe ich mal von einem Kapitalverbrechen Seiten M$ aus!

erinner moich gerade an MS DOSE 5 und 6 --> for %%a in (xyz / abc) do ...
Das Slash war ´n Bug. Wenn ich leider auch nie mitgekriegt habe, was man da alles mit machen konnte. *Schniff*

Ich glaub ich verfasse mal eine Zusammenfassung als Anleitung, damit auch andere verlorene Seelen, wie auch ich jetzt, begreifen, dass Fortschrittsbalken unter Batch nur reines Schikimiki sind.
Aber warum nicht Spaß haben.
Auch mit perversen Haarimplantaten von Gottschalk.

Ich würde fordern, dass M$ wieder das gute alte DOS einführt.

Schönen 10. noch.

Und verlauft euch nicht in den Völkerwanderungen zu x Supermärkten.