Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Batch Prozent der Formatierung auslesen

Frage Entwicklung Batch & Shell

Mitglied: 90776

90776 (Level 2)

04.01.2011 um 07:51 Uhr, 4625 Aufrufe, 9 Kommentare

Ich wünsche euch allen ein schönes neues Jahr

Nun zu meiner Frage:

wie kann man den Prozentwert der Formatierung auslesen?

01.
C:\Windows\system32>format G: 
02.
Legen Sie eine neue Diskette in Laufwerk G: ein, 
03.
und drücken Sie die EINGABETASTE. 
04.
Der Typ des Dateisystems ist FAT32. 
05.
Überprüfung von 979 MB 
06.
XX Prozent bearbeitet.
denn die Position ist ja Variabel

Grüsse

Switcher
Mitglied: jeb-the-batcher
05.01.2011 um 00:46 Uhr
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.
Bitte warten ..
Mitglied: pieh-ejdsch
05.01.2011 um 03:10 Uhr
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
01.
@echo off&setlocal 
02.
del datei 
03.
start /min cmd /c "echo.|format l: /v:leer>Datei" 
04.
set /a Zeit = 2000 
05.
set /a neu = 0 , alt = 0 , DZeit = Zeit * 2 
06.
for /l %%i in (0,1,%DZeit%) do echo.>nul 
07.
:anfang 
08.
more +4 datei>datei2 
09.
set /p Line=<datei2 
10.
set "Line=%Line: 
11.
=" "%" 
12.
for %%i in ("%Line%") do for /f %%j in ("%%~i") do if %%j gtr 0 if %%j lss 28 set "Neu=%%j" 
13.
 
14.
set /a NeuVergleich = alt + 1 
15.
if %NeuVergleich% gtr %Neu% set /a Zeit + = (Zeit / 10) 
16.
if %NeuVergleich% lss %Neu% set /a Zeit - = (Zeit / 10) 
17.
set "Alt=%Neu%" 
18.
:Limit 
19.
for /l %%i in (0,1,%Zeit%) do echo.>nul 
20.
echo %zeit% 
21.
echo %time% 
22.
echo %neu% Prozent fertig 
23.
echo. 
24.
if %neu% equ 100 echo Formatieren ist Fertig& goto :eof 
25.
if %neu% geq 27 set /a Neu + = 1 &goto :Limit 
26.
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
Bitte warten ..
Mitglied: pieh-ejdsch
05.01.2011 um 16:08 Uhr
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...

01.
@echo off&setlocal 
02.
 
03.
::: Create <CR> 
04.
copy /y /z "%Windir%\System32\shell32.dll" "%temp%">"%temp%\CR" 
05.
del "%temp%\shell32.dll" 
06.
set /p CR=<"%temp%\CR" 
07.
del "%temp%\CR" 
08.
setlocal enabledelayedexpansion 
09.
set "CR=!CR:~14,1!" 
10.
 
11.
12.
echo @echo off 
13.
echo set "Zeile=%%Zeile:!CR!=" "%%" 
14.
)>"%temp%\CR.cmd" 
15.
 
16.
::: Begin 
17.
start /min cmd /c "echo.|format m: /v:leer>"%temp%\Datei" 
18.
set /a Zeit = 2000 
19.
set /a neu = 0 , alt = 0 , DZeit = Zeit * 2 
20.
for /l %%i in (0,1,%DZeit%) do @echo.>nul 
21.
 
22.
:anfang 
23.
more +4 "%temp%\Datei">"%temp%\Datei2" 
24.
 
25.
for /f "usebackq delims=" %%i in ("%temp%\Datei2") do ( 
26.
	set "Zeile=%%i" 
27.
	call "%temp%\CR.cmd" 
28.
	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" 
29.
30.
set /a NeuVergleich = alt + 1 
31.
if %NeuVergleich% gtr %Neu% set /a Zeit + = (Zeit / 10) 
32.
if %NeuVergleich% lss %Neu% set /a Zeit - = (Zeit / 10) 
33.
for /l %%i in (0,1,%Zeit%) do @echo.>nul 
34.
if not %alt% == %neu% ( 
35.
echo %zeit% 
36.
echo %time% 
37.
echo %neu% Prozent fertig 
38.
echo. 
39.
40.
set "Alt=%Neu%" 
41.
if %neu% equ 100 echo Formatieren ist Fertig& goto :eof 
42.
goto :anfang
Gruß Phil
Bitte warten ..
Mitglied: Biber
05.01.2011 um 16:28 Uhr
@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
Bitte warten ..
Mitglied: 90776
05.01.2011 um 18:42 Uhr
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
Bitte warten ..
Mitglied: jeb-the-batcher
05.01.2011 um 22:06 Uhr
@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
01.
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
01.
set /a NeuVergleich = alt + 1  
02.
if %NeuVergleich% gtr %Neu% set /a Zeit + = (Zeit / 10)  
03.
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)
Bitte warten ..
Mitglied: pieh-ejdsch
05.01.2011 um 23:48 Uhr
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
Bitte warten ..
Mitglied: Biber
06.01.2011 um 19:12 Uhr
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:
01.
@echo off & setlocal 
02.
del datei 2>nul 
03.
start /min cmd /c "echo.|format M: /v:leer>Datei" 
04.
:Loop 
05.
cls 
06.
if exist datei more +5 datei>datei2 
07.
if exist datei findstr /C:"Prozent bearbeitet" Datei2 
08.
sleep -m 1000 
09.
goto :Loop
Aber volkswirtschaftlich sinnvoller ist es vielleicht, Klingeltöne ins Oberfränkische zu übersetzen.

Grüße
Biber
Bitte warten ..
Mitglied: jeb-the-batcher
06.01.2011 um 20:43 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(3)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
Per Batch Textdatei Spaltenweise auslesen nochmal weil ich dumm bin (9)

Frage von PinkFLuffyUnicorn zum Thema Batch & Shell ...

Batch & Shell
Batch Textdatei Spaltenweise auslesen (7)

Frage von PinkFLuffyUnicorn zum Thema Batch & Shell ...

Batch & Shell
gelöst BATCH: Daten aus Textdatei auslesen und in neue Textdatei separieren (9)

Frage von Manuel1234 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...