90776
04.01.2011
6101
9
0
Batch Prozent der Formatierung auslesen
Ich wünsche euch allen ein schönes neues Jahr
Nun zu meiner Frage:
wie kann man den Prozentwert der Formatierung auslesen?
denn die Position ist ja Variabel
Grüsse
Switcher
Nun zu meiner Frage:
wie kann man den Prozentwert der Formatierung auslesen?
C:\Windows\system32>format G:
Legen Sie eine neue Diskette in Laufwerk G: ein,
und drücken Sie die EINGABETASTE.
Der Typ des Dateisystems ist FAT32.
Überprüfung von 979 MB
XX Prozent bearbeitet.
denn die Position ist ja Variabel
Grüsse
Switcher
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 157941
Url: https://administrator.de/forum/batch-prozent-der-formatierung-auslesen-157941.html
Ausgedruckt am: 22.12.2024 um 18:12 Uhr
9 Kommentare
Neuester Kommentar
Hallo switcher94,
möglich scheint es zu sein ... aber einfach ist es nicht.
Ich würde den Format Befehl in eine Datei umleiten, asynchron dazu noch eine Batchdatei starten,
die genau diese Datei prüft und das Ende ausliest.
Jedes mal wenn "XX Prozent bearbeitet" gelesen wurde, die Datei löschen.
Die Prozentangabe aus dem eingelesenem String zu extrahieren ist dabei noch das leichteste.
Sprich: Wenn man nicht gerade Spaß an solchen Sachen hat, sollte man es vielleicht besser lassen.
möglich scheint es zu sein ... aber einfach ist es nicht.
Ich würde den Format Befehl in eine Datei umleiten, asynchron dazu noch eine Batchdatei starten,
die genau diese Datei prüft und das Ende ausliest.
Jedes mal wenn "XX Prozent bearbeitet" gelesen wurde, die Datei löschen.
Die Prozentangabe aus dem eingelesenem String zu extrahieren ist dabei noch das leichteste.
Sprich: Wenn man nicht gerade Spaß an solchen Sachen hat, sollte man es vielleicht besser lassen.
moin switcher, moin jeb,
mit Bachtmitteln ist das bis zu 27 Prozent Möglich danach kann set /p den Rest der Zeile nicht mehr darstellen bzw in die Variable aufnehmen
in einer ForSchleife kann man Diese Datei auch nicht verwerten weil ein <CR> ohne <LF> vor die nächste Prozentausgabe angefügt wird.
die Zeilen können deswegen nicht mit Set gesetzt werden.
der Befehl (auch echo ) Verschwindet einfach und wird nicht ausgeführt.
wenn Du die Ausgabe vom Format in eine Datei Umleitest siehst Du das Ergebnis.
das <CR> lässt sich im Set mit Erweiterter darstellung entfernen aber nur mit set /p Aufnehmen.
entweder es geht mit vbs oder einen HexEditor, welcher die <CR> ohne <LF> löscht.
eine andere Möglichkeit ist die WarteZeit von einem Prozent zum anderen in etwa Hochzurechnen und die Prozente nach 27 so auszugeben.
inetwa so
[Edit] selbst hier wird das <CR> nicht aufgenommen dazu
ausführen und Datei öffnen und das<CR> rausklmüstern vor "1 Prozent" und in Zeile 10 den Set Befehl nach dem : einfügen und Zeile 11 dranhängen
oder einen anderen Befehl nehmen welcher ein Prozentanzeige hat zB. COPY /Z /Y Quelle Ziel>Datei [/EDIT]
Gruß Phil
mit Bachtmitteln ist das bis zu 27 Prozent Möglich danach kann set /p den Rest der Zeile nicht mehr darstellen bzw in die Variable aufnehmen
in einer ForSchleife kann man Diese Datei auch nicht verwerten weil ein <CR> ohne <LF> vor die nächste Prozentausgabe angefügt wird.
die Zeilen können deswegen nicht mit Set gesetzt werden.
der Befehl (auch echo ) Verschwindet einfach und wird nicht ausgeführt.
wenn Du die Ausgabe vom Format in eine Datei Umleitest siehst Du das Ergebnis.
das <CR> lässt sich im Set mit Erweiterter darstellung entfernen aber nur mit set /p Aufnehmen.
entweder es geht mit vbs oder einen HexEditor, welcher die <CR> ohne <LF> löscht.
eine andere Möglichkeit ist die WarteZeit von einem Prozent zum anderen in etwa Hochzurechnen und die Prozente nach 27 so auszugeben.
inetwa so
@echo off&setlocal
del datei
start /min cmd /c "echo.|format l: /v:leer>Datei"
set /a Zeit = 2000
set /a neu = 0 , alt = 0 , DZeit = Zeit * 2
for /l %%i in (0,1,%DZeit%) do echo.>nul
:anfang
more +4 datei>datei2
set /p Line=<datei2
set "Line=%Line:
=" "%"
for %%i in ("%Line%") do for /f %%j in ("%%~i") do if %%j gtr 0 if %%j lss 28 set "Neu=%%j"
set /a NeuVergleich = alt + 1
if %NeuVergleich% gtr %Neu% set /a Zeit + = (Zeit / 10)
if %NeuVergleich% lss %Neu% set /a Zeit - = (Zeit / 10)
set "Alt=%Neu%"
:Limit
for /l %%i in (0,1,%Zeit%) do echo.>nul
echo %zeit%
echo %time%
echo %neu% Prozent fertig
echo.
if %neu% equ 100 echo Formatieren ist Fertig& goto :eof
if %neu% geq 27 set /a Neu + = 1 &goto :Limit
goto :anfang
echo.|format l: /v:leer>Datei
oder einen anderen Befehl nehmen welcher ein Prozentanzeige hat zB. COPY /Z /Y Quelle Ziel>Datei [/EDIT]
Gruß Phil
moin,
die For-Schleife holt doch die gesamte Zeile mit zwischenliegenden <CR> in eine Variable jedoch keine tokens.
was mir jetzt gelungen ist - das <CR> durch einen call aus der For-Schleife zu ersetzen.
das <CR> wird aus der Ausgabe vom COPY extrahiert.
die Anzeige vergleicht jetzt bis 100 Prozent geht also ziemlich genau.
was Du allerdings damit machen willst - eventuell eine Restzeitanzeige einbauen...
Gruß Phil
die For-Schleife holt doch die gesamte Zeile mit zwischenliegenden <CR> in eine Variable jedoch keine tokens.
was mir jetzt gelungen ist - das <CR> durch einen call aus der For-Schleife zu ersetzen.
das <CR> wird aus der Ausgabe vom COPY extrahiert.
die Anzeige vergleicht jetzt bis 100 Prozent geht also ziemlich genau.
was Du allerdings damit machen willst - eventuell eine Restzeitanzeige einbauen...
@echo off&setlocal
::: Create <CR>
copy /y /z "%Windir%\System32\shell32.dll" "%temp%">"%temp%\CR"
del "%temp%\shell32.dll"
set /p CR=<"%temp%\CR"
del "%temp%\CR"
setlocal enabledelayedexpansion
set "CR=!CR:~14,1!"
(
echo @echo off
echo set "Zeile=%%Zeile:!CR!=" "%%"
)>"%temp%\CR.cmd"
::: Begin
start /min cmd /c "echo.|format m: /v:leer>"%temp%\Datei"
set /a Zeit = 2000
set /a neu = 0 , alt = 0 , DZeit = Zeit * 2
for /l %%i in (0,1,%DZeit%) do @echo.>nul
:anfang
more +4 "%temp%\Datei">"%temp%\Datei2"
for /f "usebackq delims=" %%i in ("%temp%\Datei2") do (
set "Zeile=%%i"
call "%temp%\CR.cmd"
for %%j in ("!Zeile!") do for /f "tokens=1,2" %%k in ("%%~j") do if "%%l" == "Prozent" if %%k gtr 0 if %%k lss 101 set "Neu=%%k"
)
set /a NeuVergleich = alt + 1
if %NeuVergleich% gtr %Neu% set /a Zeit + = (Zeit / 10)
if %NeuVergleich% lss %Neu% set /a Zeit - = (Zeit / 10)
for /l %%i in (0,1,%Zeit%) do @echo.>nul
if not %alt% == %neu% (
echo %zeit%
echo %time%
echo %neu% Prozent fertig
echo.
)
set "Alt=%Neu%"
if %neu% equ 100 echo Formatieren ist Fertig& goto :eof
goto :anfang
Gruß Phil
@jeb-the-batcher & pieh-ejdsch
Es ist aber in diesem Zweig des Forums auch erlaubt zu antworten:
Was soll das denn... die Prozentanzeige des Format-Befehls ist doch nun wirklich schon die end-dau-angemessene "Fortschrittsanzeige" der Formatierung.
Und hey! Es ist doch hoffentlich auch beim Betriebssystem Windows bald Geschichte, dass eine Formatierung eine lesbare Prozentanzeige hat.
Normalerweise sollte so etwas einmal "witsch" machen und gut.
@Zwitscher: Könntest du mit der Antwort leben: "Geht leider nicht, trotzdem schönen Nachmittag"?
Grüße
Biber
Es ist aber in diesem Zweig des Forums auch erlaubt zu antworten:
"Es ist sicherlich möglich, eine al-dente-gekochte Maccheroni durch einen Amboss zu schiessen.... aber Batch ist nicht das optimale Werkzeug dafür"
Was soll das denn... die Prozentanzeige des Format-Befehls ist doch nun wirklich schon die end-dau-angemessene "Fortschrittsanzeige" der Formatierung.
Und hey! Es ist doch hoffentlich auch beim Betriebssystem Windows bald Geschichte, dass eine Formatierung eine lesbare Prozentanzeige hat.
Normalerweise sollte so etwas einmal "witsch" machen und gut.
@Zwitscher: Könntest du mit der Antwort leben: "Geht leider nicht, trotzdem schönen Nachmittag"?
Grüße
Biber
@pieh-ejdsch
Interessante Variante ein CR zu erzeugen, die kannte ich noch nicht, wobei ich mich nicht darauf verlassen würde, dass in jeder Windows Version shell32.dll gerade an Position 14 ein einzelnes CR enthält.
Allerdings hätte man sich auch gar kein CR erzeugen müssen, die wird man auch alle durch eine einfache Expansion wieder los
vernichtet alle CR's (Ende von Phase 1, Die Geheimnisse des Batch Zeilen Interpreters).
Ich bin mir auch nicht ganz sicher, ob das ganze bis 100% immer funktioniert.
Ich habe mit chkdsk getestet (mit mäßigem Erfolg), und das braucht bei mir recht lange und erzeugt dabei auch extrem viele Daten, so dass vermutlich irgendwann die maximale Zeilenlänge der "xx Prozent"-Zeile erreicht wird.
Mein Vorschlag die Datei einfach zwischendurch zu löschen, klappt leider auch nicht, da die Datei für Schreiboperationen gesperrt ist.
Aber was auch klappt ist FC, man kopiert immer einen Zwischenstand der Datei, und danach vergleicht man die aktuelle Datei mit dem Zwischstand bis diese sich unterscheiden, und FC listet die Unterschiede auch brav in eigenen Zeilen auf.
Eine Frage habe ich dann aber noch zu dem Teil
Wozu ist das gut? Und kann überhaupt %NeuVergleich% jemals kleiner als %Neu% sein?
jeb (der immer an den Problemen interessiert ist, die man mit Batch eigentlich nicht lösen sollte)
Interessante Variante ein CR zu erzeugen, die kannte ich noch nicht, wobei ich mich nicht darauf verlassen würde, dass in jeder Windows Version shell32.dll gerade an Position 14 ein einzelnes CR enthält.
Allerdings hätte man sich auch gar kein CR erzeugen müssen, die wird man auch alle durch eine einfache Expansion wieder los
set "zeile=%zeile%"
Ich bin mir auch nicht ganz sicher, ob das ganze bis 100% immer funktioniert.
Ich habe mit chkdsk getestet (mit mäßigem Erfolg), und das braucht bei mir recht lange und erzeugt dabei auch extrem viele Daten, so dass vermutlich irgendwann die maximale Zeilenlänge der "xx Prozent"-Zeile erreicht wird.
Mein Vorschlag die Datei einfach zwischendurch zu löschen, klappt leider auch nicht, da die Datei für Schreiboperationen gesperrt ist.
Aber was auch klappt ist FC, man kopiert immer einen Zwischenstand der Datei, und danach vergleicht man die aktuelle Datei mit dem Zwischstand bis diese sich unterscheiden, und FC listet die Unterschiede auch brav in eigenen Zeilen auf.
Eine Frage habe ich dann aber noch zu dem Teil
set /a NeuVergleich = alt + 1
if %NeuVergleich% gtr %Neu% set /a Zeit + = (Zeit / 10)
if %NeuVergleich% lss %Neu% set /a Zeit - = (Zeit / 10)
Wozu ist das gut? Und kann überhaupt %NeuVergleich% jemals kleiner als %Neu% sein?
jeb (der immer an den Problemen interessiert ist, die man mit Batch eigentlich nicht lösen sollte)
moin jeb,
die shell32.dll sollte es ja auf jeden Windows System geben. Groß genug ist sie auch um ein Paar ProzentAusgaben wärend des Kopierens mit "COPY /y /z ..." auszugeben. Ich verwerte also nur die Ausgabe vomCopyBefehl was mit jeder anderen ausreichend großen Datei auch gehen sollte.
ist eigentlich nur für die Hochrechnung beim 27 Prozent Kommentar gewesen, aber man kann es auch drinlassen weil es die LeseZugriffe auf die Batch veringert - und CPU sowie HDD nicht Überbelastet werden.
@10750
das ist eben die Ausgabe von den Befehl. Damit er das Ordentlich Anzeigen kann wird halt ein <CR> in die Ausgabe eingefügt, damit die CMD-Line nicht Überläuft. Ich finde das ist doch gut gelöst von den Jungs - und für gut befunden - es hat sich ja sonst noch keiner darüber Beschwert. Es gibt genug Problemme in Batch/CMD aber es ist schon gut durchdacht und Praktikabel. Nur die Reaktion auf irgendeinen Befehl ist unerwartet - aber die CMD tut genau das richtige.
@Biber
sicherlich könnte ich sowas auch hinschreiben, aber ich bin nicht bereit vor Irgendeinen Probem zu stehen und zu sagen: Nein das schaffe ich nicht! Dafür bin ich viel zu Ehrgeizig/Pingelig.
Gruß Phil
...wobei ich mich nicht darauf verlassen würde, dass...
das <CR> wird ja nicht aus der shell32.dll geholt, sondern aus der Kopieraktion dieser Datei nach %temp%.die shell32.dll sollte es ja auf jeden Windows System geben. Groß genug ist sie auch um ein Paar ProzentAusgaben wärend des Kopierens mit "COPY /y /z ..." auszugeben. Ich verwerte also nur die Ausgabe vomCopyBefehl was mit jeder anderen ausreichend großen Datei auch gehen sollte.
set "zeile=%zeile%"
Hab ich doch nicht so genau in Deiner Anleitung gelesen - ich hatte es erst mit einem Call in eine Sub mit Parameter probiert aber habe immer Versucht das <CR> mit " " zu ersetzen (was Voraussetzte, dass das <CR> schon im Klartext dasteht - weil sonst die Ersetzung weder mit der Vorzögerung noch ohne Verzögerung geklappt hat), was den Vorteil hat das der String nicht in etwa 100 Tokens Zerlegt werden muss. Daher dann der Call in eine Batch. Es hätte sicher noch zig andere Lösungen dafür gegeben.Eine Frage habe ich dann aber noch zu dem Teil
Wozu ist das gut? ... kann überhaupt %NeuVergleich% jemals kleiner als %Neu% sein?
ja wird auch - wenn Du eine 256MB große SD Karte damit Formatierst wird der Wert erst steigen und dann sinken - also ist der Prozentwert der Formatierung mal ein bischen schneller als das Zeitlimit um den neuen +1 Wert auszulesen.Wozu ist das gut? ... kann überhaupt %NeuVergleich% jemals kleiner als %Neu% sein?
ist eigentlich nur für die Hochrechnung beim 27 Prozent Kommentar gewesen, aber man kann es auch drinlassen weil es die LeseZugriffe auf die Batch veringert - und CPU sowie HDD nicht Überbelastet werden.
@10750
das ist eben die Ausgabe von den Befehl. Damit er das Ordentlich Anzeigen kann wird halt ein <CR> in die Ausgabe eingefügt, damit die CMD-Line nicht Überläuft. Ich finde das ist doch gut gelöst von den Jungs - und für gut befunden - es hat sich ja sonst noch keiner darüber Beschwert. Es gibt genug Problemme in Batch/CMD aber es ist schon gut durchdacht und Praktikabel. Nur die Reaktion auf irgendeinen Befehl ist unerwartet - aber die CMD tut genau das richtige.
@Biber
sicherlich könnte ich sowas auch hinschreiben, aber ich bin nicht bereit vor Irgendeinen Probem zu stehen und zu sagen: Nein das schaffe ich nicht! Dafür bin ich viel zu Ehrgeizig/Pingelig.
Gruß Phil
Moin Phil,
Meine Formulierung war doch nicht "Ich schaffe es nicht".
Die Maccheroni-Nummer hab ich auch schon viermal geschafft, einmal davon beim Telefonieren.
Ich bin nur der Ansicht, dass Aufwand und möglicher Nutzen in keinem gesunden Verhältnis zueinander stehen.
Und wenn solche Dönekens, dann etwas schlichter:
Aber volkswirtschaftlich sinnvoller ist es vielleicht, Klingeltöne ins Oberfränkische zu übersetzen.
Grüße
Biber
Zitat von @pieh-ejdsch:
@Biber
sicherlich könnte ich sowas auch hinschreiben, aber ich bin nicht bereit vor Irgendeinen Probem zu stehen und zu sagen:
Nein das schaffe ich nicht! Dafür bin ich viel zu Ehrgeizig/Pingelig.
@Biber
sicherlich könnte ich sowas auch hinschreiben, aber ich bin nicht bereit vor Irgendeinen Probem zu stehen und zu sagen:
Nein das schaffe ich nicht! Dafür bin ich viel zu Ehrgeizig/Pingelig.
Meine Formulierung war doch nicht "Ich schaffe es nicht".
Die Maccheroni-Nummer hab ich auch schon viermal geschafft, einmal davon beim Telefonieren.
Ich bin nur der Ansicht, dass Aufwand und möglicher Nutzen in keinem gesunden Verhältnis zueinander stehen.
Und wenn solche Dönekens, dann etwas schlichter:
@echo off & setlocal
del datei 2>nul
start /min cmd /c "echo.|format M: /v:leer>Datei"
:Loop
cls
if exist datei more +5 datei>datei2
if exist datei findstr /C:"Prozent bearbeitet" Datei2
sleep -m 1000
goto :Loop
Aber volkswirtschaftlich sinnvoller ist es vielleicht, Klingeltöne ins Oberfränkische zu übersetzen.
Grüße
Biber
Zitat von @Biber:
Ich bin nur der Ansicht, dass Aufwand und möglicher Nutzen in keinem gesunden Verhältnis zueinander stehen.
Ich bin nur der Ansicht, dass Aufwand und möglicher Nutzen in keinem gesunden Verhältnis zueinander stehen.
Aber dann hätte ich nicht die nette Idee gesehen wie pieh-ejdsch (Philipp) das CR mit einem Copy /z erzeugt, so hatte das Ganze durchaus einen Nutzen.
Grüße
jeb