90776
Goto Top

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?

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

Content-ID: 157941

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

Ausgedruckt am: 09.11.2024 um 01:11 Uhr

jeb-the-batcher
jeb-the-batcher 05.01.2011 um 00:46:51 Uhr
Goto Top
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.
pieh-ejdsch
pieh-ejdsch 05.01.2011 um 03:10:03 Uhr
Goto Top
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
@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
[Edit] selbst hier wird das <CR> nicht aufgenommen dazu
echo.|format l: /v:leer>Datei
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
pieh-ejdsch
pieh-ejdsch 05.01.2011 um 16:08:08 Uhr
Goto Top
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...

@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
Biber
Biber 05.01.2011 um 16:28:52 Uhr
Goto Top
@jeb-the-batcher & pieh-ejdsch

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
90776
90776 05.01.2011 um 18:42:22 Uhr
Goto Top
Erstmal danke an alle die sich die mühe gemacht haben...

und ja Biber mit der antwort kann ich leben.

nur ich frag mich einfach warum es (für microsoft) so schwierig ist die ausgabe "ihrer programme" ein wenig Kunden - und bearbeitungsfreundlicher zu machen

eben Herzlichen Dank nochmals vorallem an pieh-ejdsch der sich ja wirklich sehr viel Mühe gemacht hat.

Grüsse
Switcher
jeb-the-batcher
jeb-the-batcher 05.01.2011 um 22:06:09 Uhr
Goto Top
@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
set "zeile=%zeile%"  
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
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)
pieh-ejdsch
pieh-ejdsch 05.01.2011 um 23:48:23 Uhr
Goto Top
moin jeb,
...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.
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
Biber
Biber 06.01.2011 um 19:12:11 Uhr
Goto Top
Moin Phil,

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.

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
jeb-the-batcher
jeb-the-batcher 06.01.2011 um 20:43:54 Uhr
Goto Top
Zitat von @Biber:
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