Datensicherung per Batch
Hallo,
ich suche wieder einmal Hilfe bei der Batchprogrammierung.
Ich habe heute einen Rechner übernommen, bei dem per Win2000 eigenem Backup täglich eine Sicherung lokal erzeugt wird.
Dieses File wird damm auf ein DVD-RAM geschoben und danach lokal gelöscht.
In einem ersten Schritt möchte ich wenigstens nach dem Schreiben auf die DVD-RAM die Dateien vergleichen und je nach Errorlevel dann die Meldungen ausgeben.
Leider fällt mir dazu kein Ansatz zum Vergleichen ein, bin also für Eure Hilfe dankbar.
Im nächsten Schritt ist denkbar zu prüfen, ob anhand z.B. des Datums der letzten Änderung des Files auf der RAM überhaupt die DVD gewechselt wurde.
viele Grüße
Roland
ich suche wieder einmal Hilfe bei der Batchprogrammierung.
Ich habe heute einen Rechner übernommen, bei dem per Win2000 eigenem Backup täglich eine Sicherung lokal erzeugt wird.
Dieses File wird damm auf ein DVD-RAM geschoben und danach lokal gelöscht.
In einem ersten Schritt möchte ich wenigstens nach dem Schreiben auf die DVD-RAM die Dateien vergleichen und je nach Errorlevel dann die Meldungen ausgeben.
Leider fällt mir dazu kein Ansatz zum Vergleichen ein, bin also für Eure Hilfe dankbar.
Im nächsten Schritt ist denkbar zu prüfen, ob anhand z.B. des Datums der letzten Änderung des Files auf der RAM überhaupt die DVD gewechselt wurde.
viele Grüße
Roland
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 15346
Url: https://administrator.de/contentid/15346
Ausgedruckt am: 13.11.2024 um 12:11 Uhr
14 Kommentare
Neuester Kommentar
Moin, ropo,
na, sooo komplex hört es sich noch nicht an.
Also, als für Deinen Fall voll ausreichendes Tool liefert M$ das Utility FC (FileCompare) mit.
FC [/A] [/C] [/L] [/LBn] [/N] [/T] [/U] [/W] [/nnnn]
[Laufwerk1:][Pfad1]Dateiname1[Laufwerk2:][Pfad2]Dateiname2
FC /B [Laufwerk1:][Pfad1]Dateiname1 [Laufwerk2:][Pfad2]Dateiname2
/A Zeigt nur die erste und letzte Zeile jedes Satzes von
Unterschieden an.
/B Führt einen binären Vergleich durch.
/C Vergleicht ohne Rücksicht auf Groß-/Kleinschreibung.
/L Vergleicht Dateien als ASCII-Textdateien.
/LBn Stellt die maximale Zahl aufeinander folgender, unterschiedlicher
Zeilen auf die angegebene Anzahl n ein.
/N Zeigt bei einem ASCII-Vergleich die Zeilennummern an.
/T Expandiert Tabulatorzeichen nicht zu Leerzeichen.
/U Vergleicht Dateien als UNICODE-Textdateien.
/W Komprimiert Tabulatoren und Leerzeichen für den Vergleichsvorgang.
/nnnn Anzahl aufeinander folgender Zeilen, die nach einem Unterschied
wieder übereinstimmen müssen.
Und, was Du in Deinem Batch brauchst: FC liefert natürlich auch ein Errorlevel von 0, wenn der Vergleich okay ist und ein Errorlevel <> 0, wenns danebenhaut.
Sicherlich sogar etwas differenzierter, aber M$'s Errorlevel sind ähnlich sauber dokumentiert wie die Beraterverträge von Bundestagsabgeordneten.. musst Du mal selber testen, welcher Errorlevel wann kommt (Dateien unterschiedlich groß, Datei1 nicht lesbar, Datei1 nicht gefunden, Datei2 nicht lesbar, Datei2 nicht gefunden, Unterschiedlicher Inhalt...)
Und mit dem Datumsvergleich, das würde ich "über Bande" machen:
Nach dem Auf-DVD-Brennen und Datei-Vergleich-ist-Okay diese (beiden) Datei-Informationen mit Name, Größe, Dateidatum meinetwegen mit "dir backupdateiname > lastbackup.log" in eine Mini-Log-Datei schreiben und deren Inhalt dann mit der neuen Dir-Information bei der nächsten Sicherung vergleichen. Bzw mit dem Dir-Output beim Einlegen der DVD.
Biber
na, sooo komplex hört es sich noch nicht an.
Also, als für Deinen Fall voll ausreichendes Tool liefert M$ das Utility FC (FileCompare) mit.
FC [/A] [/C] [/L] [/LBn] [/N] [/T] [/U] [/W] [/nnnn]
[Laufwerk1:][Pfad1]Dateiname1[Laufwerk2:][Pfad2]Dateiname2
FC /B [Laufwerk1:][Pfad1]Dateiname1 [Laufwerk2:][Pfad2]Dateiname2
/A Zeigt nur die erste und letzte Zeile jedes Satzes von
Unterschieden an.
/B Führt einen binären Vergleich durch.
/C Vergleicht ohne Rücksicht auf Groß-/Kleinschreibung.
/L Vergleicht Dateien als ASCII-Textdateien.
/LBn Stellt die maximale Zahl aufeinander folgender, unterschiedlicher
Zeilen auf die angegebene Anzahl n ein.
/N Zeigt bei einem ASCII-Vergleich die Zeilennummern an.
/T Expandiert Tabulatorzeichen nicht zu Leerzeichen.
/U Vergleicht Dateien als UNICODE-Textdateien.
/W Komprimiert Tabulatoren und Leerzeichen für den Vergleichsvorgang.
/nnnn Anzahl aufeinander folgender Zeilen, die nach einem Unterschied
wieder übereinstimmen müssen.
Und, was Du in Deinem Batch brauchst: FC liefert natürlich auch ein Errorlevel von 0, wenn der Vergleich okay ist und ein Errorlevel <> 0, wenns danebenhaut.
Sicherlich sogar etwas differenzierter, aber M$'s Errorlevel sind ähnlich sauber dokumentiert wie die Beraterverträge von Bundestagsabgeordneten.. musst Du mal selber testen, welcher Errorlevel wann kommt (Dateien unterschiedlich groß, Datei1 nicht lesbar, Datei1 nicht gefunden, Datei2 nicht lesbar, Datei2 nicht gefunden, Unterschiedlicher Inhalt...)
Und mit dem Datumsvergleich, das würde ich "über Bande" machen:
Nach dem Auf-DVD-Brennen und Datei-Vergleich-ist-Okay diese (beiden) Datei-Informationen mit Name, Größe, Dateidatum meinetwegen mit "dir backupdateiname > lastbackup.log" in eine Mini-Log-Datei schreiben und deren Inhalt dann mit der neuen Dir-Information bei der nächsten Sicherung vergleichen. Bzw mit dem Dir-Output beim Einlegen der DVD.
Biber
Hallo zusammen,
ich bin grade daran ein ähnliches Skript zuschreiben, wie auch schon in meinem anderen Thread beschrieben. Den Befehl mit dem Datenvergleichen macht schon mal genau dass was ich will, aber irgendwie bekomme ich das mit den Errorlevel nicht hin. Also das er mir ne Textausgabe macht wenn es daneben geht könnte mir da jemand mal kurz was zu schreiben.
danke
ich bin grade daran ein ähnliches Skript zuschreiben, wie auch schon in meinem anderen Thread beschrieben. Den Befehl mit dem Datenvergleichen macht schon mal genau dass was ich will, aber irgendwie bekomme ich das mit den Errorlevel nicht hin. Also das er mir ne Textausgabe macht wenn es daneben geht könnte mir da jemand mal kurz was zu schreiben.
danke
Hallo zusammen,
habe das folgende Problem ich möchte gerne das alle Textdateien mit einander verglichen werden, er kontrolliert auch alle Dateien das ist nicht das Problem aber er gibt mir nur eine Textmeldung aus obwohl ich 3 Dateien zum überprüfen haben
FOR %%a in (C:\*.txt) do
fc /b C:\%%a C:\sader.\%%a
goto L%errorlevel%
:L0
echo geht >>geht.txt
goto vergleich
:L1
echo Datei nicht vorhanden >>geht.txt
goto vergleich
:L2
echo Datei nicht vorhanden >>geht.txt
goto vergleich
:vergleich
echo Kontrolle fertig >>geht.txt
habe das folgende Problem ich möchte gerne das alle Textdateien mit einander verglichen werden, er kontrolliert auch alle Dateien das ist nicht das Problem aber er gibt mir nur eine Textmeldung aus obwohl ich 3 Dateien zum überprüfen haben
FOR %%a in (C:\*.txt) do
fc /b C:\%%a C:\sader.\%%a
goto L%errorlevel%
:L0
echo geht >>geht.txt
goto vergleich
:L1
echo Datei nicht vorhanden >>geht.txt
goto vergleich
:L2
echo Datei nicht vorhanden >>geht.txt
goto vergleich
:vergleich
echo Kontrolle fertig >>geht.txt
nAbend ropo,
Also, denke schon, Du bekommst es auch ohne mich hin, aber ein, zwei Tipps kann ich ja noch abladen:
Teil des Backup.cmd:
FC /B "c:\Backup\Backup.bkf" "C:\DASI\Backup.bkf" >nul
call :Meldung%ErrorLevel%
:end
::--ggf Aufräumarbeiten, Abschiedsworte an der User, Logfile schreiben, Vars löschen
:: ~~~
goto :eof
::-----hier ist der Batch zu Ende. goto :eof entspricht einem RETURN
:Meldung0
echo Datensicherung erfolgreich beendet!!!
:: ein goto :eof bei einer geCALLten "Unterroutine" bedeutet :"Zurück zum Aufrufer"
goto :eof
::-
:Meldung1
echo Fehler beim Lesen der Dateien
goto :eof
:Meldung2
echo Fehler: Unterschiede beim Dateivergleich
Echo Wollen Sie jetzt weinen oder noch mal versuchen?
goto :eof
endOfThisBatch
Zu der anderen Frage (die Minilogdatei auslesen)
Die sieht ja ungefähr so aus:
Wenn das Dingen xy.log heißen würde:
type xy.log |find "backup.bkf" .... bringt Dir die wichtige Zeile...
In dieser Zeile ("30.09.2005 20:26 109.568 Backup.bkf ") sind vier mit Leerzeichen getrennte "Spalten", die Du mit dem FOR /F-Befehl einzeln rausfieseln kannst.
Also in etwa so (ungetestet, nur phantasiert) im Batch:
For /F "tokens=1-3" %%a in ('type xy.log ^|find "backup.bkf" ') do echo LastDVDDatum:%%a LastDVDZeit %%b LastDVDBytes: %%c
oder in Variablen speichern:
For /F "tokens=1-3" %%a in ('type xy.log ^|find "backup.bkf" ') do (
Set "LastDVDDatum=%%a"
set "LastDVDZeit=%%b"
set "LastDVDBytes=%%c"
)
Und entsprechend genauso, auch über den Dir-Befehl z.B die Informationen von der eingelegten DVD holen und dann vergleichen...
So in etwa wäre die Skizze,
HTH & HANN
Biber
Also, denke schon, Du bekommst es auch ohne mich hin, aber ein, zwei Tipps kann ich ja noch abladen:
Teil des Backup.cmd:
FC /B "c:\Backup\Backup.bkf" "C:\DASI\Backup.bkf" >nul
call :Meldung%ErrorLevel%
:end
::--ggf Aufräumarbeiten, Abschiedsworte an der User, Logfile schreiben, Vars löschen
:: ~~~
goto :eof
::-----hier ist der Batch zu Ende. goto :eof entspricht einem RETURN
:Meldung0
echo Datensicherung erfolgreich beendet!!!
:: ein goto :eof bei einer geCALLten "Unterroutine" bedeutet :"Zurück zum Aufrufer"
goto :eof
::-
:Meldung1
echo Fehler beim Lesen der Dateien
goto :eof
:Meldung2
echo Fehler: Unterschiede beim Dateivergleich
Echo Wollen Sie jetzt weinen oder noch mal versuchen?
goto :eof
endOfThisBatch
Zu der anderen Frage (die Minilogdatei auslesen)
Die sieht ja ungefähr so aus:
Verzeichnis von c:\dasi
30.09.2005 20:26 109.568 Backup.bkf
1 Datei(en) 109.568 Bytes
0 Verzeichnis(se), 52.750.934.016 Bytes frei
Wenn das Dingen xy.log heißen würde:
type xy.log |find "backup.bkf" .... bringt Dir die wichtige Zeile...
In dieser Zeile ("30.09.2005 20:26 109.568 Backup.bkf ") sind vier mit Leerzeichen getrennte "Spalten", die Du mit dem FOR /F-Befehl einzeln rausfieseln kannst.
Also in etwa so (ungetestet, nur phantasiert) im Batch:
For /F "tokens=1-3" %%a in ('type xy.log ^|find "backup.bkf" ') do echo LastDVDDatum:%%a LastDVDZeit %%b LastDVDBytes: %%c
oder in Variablen speichern:
For /F "tokens=1-3" %%a in ('type xy.log ^|find "backup.bkf" ') do (
Set "LastDVDDatum=%%a"
set "LastDVDZeit=%%b"
set "LastDVDBytes=%%c"
)
Und entsprechend genauso, auch über den Dir-Befehl z.B die Informationen von der eingelegten DVD holen und dann vergleichen...
So in etwa wäre die Skizze,
HTH & HANN
Biber
Moin FlyingSader,
sorry, hatte Deine Frage ganz übersehen, passt aber schon hier rein.
Also:
>er kontrolliert auch alle Dateien ...
Hat er auch recht mit, so hast du ihn ja losgeschickt.
Der CMD-Interpreter arbeitet zeilenweise und "kennt" auch weder die Zeile davor noch weiß er, ob und wieviele Anweisungen darin waren oder noch kommen mögen.
Und wie einer dieser glücklichen Alzheimer-Patienten erlebt er jede Zeile wieder als etwas vollkommen Neues. Beneidenswert.
Hatte ich hier irgendwo in einem Batchtutorial schon mal beschrieben.
Heißt bezogen auf die Zeile "goto L%Errorlevel%" bei Dir: Da kann er zwar den von der vorherigen Anweisung gesetzten Errorlevel prüfen, aber dass in der Vorzeile drei Anweisungen ausgeführt wurden statt einer, kann er nicht ahnen. Und auch nicht nicht wirklich begreifen.
---
(bisheriger Zustand):
FOR %%a in (C:\*.txt) do fc /b C:\%%a C:\sader.\%%a
ECHO Errorlevel des letzten FC-Befehls in der FOR-Schleife %ErrorLevel%
Goto L%ErrorLevel%
---
:: (Neu) : die eine FOR-Zeile "zerlegen" in mehrere. Erste Zeile MUSS mit DO KlammerAuf enden
:: Am Ende nicht die KlammerZu vergessen. Muss NICHT in eine Extra-Zeile, aber das macht es lesbarer.
FOR %%a in (C:\*.txt) do (
fc /b C:\%%a C:\sader.\%%a
ECHO Errorlevel des FC-Befehls in der Vor-Zeile %ErrorLevel%
Call :L%ErrorLevel%
)
:: jetzt ein CALL :Lx statt GOTO Lx ... er soll ja die Schleife weiter durchlaufen
[Edit]
Kommentare verträgt der CMD-Interpreter nicht so gut innerhalb dieser FOR-Anweisung (die ja eigentlich auch für für ihn nach wie vor eine Zeile ist).
Jedenfalls keine mit "::". Habe die Kommentarzeile deshalb unter den Schleifenkörper gesetzt. [/Edit]
Dann zeigt er Dir auch drei (oder 27) Meldungen je nach Anzahl Dateien.
HTH Biber
sorry, hatte Deine Frage ganz übersehen, passt aber schon hier rein.
Also:
>er kontrolliert auch alle Dateien ...
aber er gibt mir nur eine Textmeldung aus obwohl ich 3 Dateien zum überprüfen habe..
Hat er auch recht mit, so hast du ihn ja losgeschickt.
Der CMD-Interpreter arbeitet zeilenweise und "kennt" auch weder die Zeile davor noch weiß er, ob und wieviele Anweisungen darin waren oder noch kommen mögen.
Und wie einer dieser glücklichen Alzheimer-Patienten erlebt er jede Zeile wieder als etwas vollkommen Neues. Beneidenswert.
Hatte ich hier irgendwo in einem Batchtutorial schon mal beschrieben.
Heißt bezogen auf die Zeile "goto L%Errorlevel%" bei Dir: Da kann er zwar den von der vorherigen Anweisung gesetzten Errorlevel prüfen, aber dass in der Vorzeile drei Anweisungen ausgeführt wurden statt einer, kann er nicht ahnen. Und auch nicht nicht wirklich begreifen.
---
(bisheriger Zustand):
FOR %%a in (C:\*.txt) do fc /b C:\%%a C:\sader.\%%a
ECHO Errorlevel des letzten FC-Befehls in der FOR-Schleife %ErrorLevel%
Goto L%ErrorLevel%
---
:: (Neu) : die eine FOR-Zeile "zerlegen" in mehrere. Erste Zeile MUSS mit DO KlammerAuf enden
:: Am Ende nicht die KlammerZu vergessen. Muss NICHT in eine Extra-Zeile, aber das macht es lesbarer.
FOR %%a in (C:\*.txt) do (
fc /b C:\%%a C:\sader.\%%a
ECHO Errorlevel des FC-Befehls in der Vor-Zeile %ErrorLevel%
Call :L%ErrorLevel%
)
:: jetzt ein CALL :Lx statt GOTO Lx ... er soll ja die Schleife weiter durchlaufen
[Edit]
Kommentare verträgt der CMD-Interpreter nicht so gut innerhalb dieser FOR-Anweisung (die ja eigentlich auch für für ihn nach wie vor eine Zeile ist).
Jedenfalls keine mit "::". Habe die Kommentarzeile deshalb unter den Schleifenkörper gesetzt. [/Edit]
Dann zeigt er Dir auch drei (oder 27) Meldungen je nach Anzahl Dateien.
HTH Biber
So sollte das jetzt aber doch eigentlich funktionieren, aber es tut es nicht. Er Bringt mit immer den Errorlevel 0 obwohl ich ihm völlig verschiedene Sernarien gebe und er es auch richtig erkennt.
FOR %%a in (*.txt) do (
fc /b C:\%%a C:\test\%%a
Call :L%ErrorLevel%
)
:L0
echo L0 >>geht.txt
goto vergleich
:L1
echo L1 >>geht.txt
goto vergleich
:L2
echo L2 >>geht.txt
goto vergleich
:vergleich
echo Kontrolle fertig >>geht.txt
Grüsse Thorsten
FOR %%a in (*.txt) do (
fc /b C:\%%a C:\test\%%a
Call :L%ErrorLevel%
)
:L0
echo L0 >>geht.txt
goto vergleich
:L1
echo L1 >>geht.txt
goto vergleich
:L2
echo L2 >>geht.txt
goto vergleich
:vergleich
echo Kontrolle fertig >>geht.txt
Grüsse Thorsten
@FlyingSader
die einzelnen ge CALLten Bläcken müssen mit "goto :eof" abgeschlossen sein.
Dann sollte es tun, was Du willst.
:L0
echo L0 >>geht.txt
goto :eof ....(also zurück in die FOR-Schleife)
Gruß
Biber
die einzelnen ge CALLten Bläcken müssen mit "goto :eof" abgeschlossen sein.
Dann sollte es tun, was Du willst.
:L0
echo L0 >>geht.txt
goto :eof ....(also zurück in die FOR-Schleife)
Gruß
Biber
Hallo ropo,
^ ist eine "Maskierung" des darauffolgenden Sonder- oder Steuerzeichens. Habe ich in einem der Batch-Tutorials mal beschrieben.
Geh mal in "Batch & Shell."
Gruß Biber
"tokens=1-3 delims= "
Ergänzung durch Trennzeichen Leerzeichen ist sicherlich ok.
Schadet nichts, ist aber ohnehin Default. Ist ok.Ergänzung durch Trennzeichen Leerzeichen ist sicherlich ok.
Wenn ich nur nach dem Dateinamen abfrage
erfolgt die korrekte Ausgabe aller Zeil('type xy.log ^|find "backup.bkf"') bringt bei mir keine Auswertung, finde
aber in der Hilfe keinen Hinweis auf einen Syntaxfehler.
Hab ich nicht verstanden, formulier mal bitte um.. *ratlos guckterfolgt die korrekte Ausgabe aller Zeil('type xy.log ^|find "backup.bkf"') bringt bei mir keine Auswertung, finde
aber in der Hilfe keinen Hinweis auf einen Syntaxfehler.
Was bedeutet eigentlich ^?
^ ist eine "Maskierung" des darauffolgenden Sonder- oder Steuerzeichens. Habe ich in einem der Batch-Tutorials mal beschrieben.
Geh mal in "Batch & Shell."
Gruß Biber
Moin FlyingSader,
sorry, Denkfehler von mir.
Ich hätte mein eigenes Geschwafel oben lesen sollen, dann hätte ich es gemerkt..*gg
Ich habe es ja selbst geschrieben, der CMD-Interpreter nimmt diese For-Anweisung
FOR %%a in (*.txt) do (
fc /b C:\%%a C:\test\%%a
Call :L%ErrorLevel%
)
als eine Anweisung, als eine Zeile entgegen und führt sie dann aus.
Heißt natürlich, dass er auch, wenn er die -für ihn eine- Anweisung ausführt, natürlich alle darin enthaltenen "normalen*" Variablen auflöst. Einmal auflöst. Nicht bei jeder FOR-Runde..
Auch den %Errorlevel%.......... *sichvornKoppklatscht
(*Außer den Zählvariablen %%a....%%c... die löst er automatisch immer aktuell auf )
Zwei Umgehungsstrategien:
a) die Errorlevel-Abfrage außerhalb der "einen" Zeile legen
FOR %%a in (*.txt) do (
fc /b C:\%%a C:\test\%%a
Call :CheckErrlevel
)
:ChkErrlevel
call :L%ErrorLevel%
goto :eof ...(zurück in die FOR-Schleife)
b)
..oder aber den CMD-Interpreter zur "verspäteten Variablenauflösung" zwingen.
Vor der FOR-Schleife schreiben:
Setlocal EnableDelayedExpansion
und die Variablen, die "verspätet" aufgelöst werden sollen, in Ausrufe-Zeichen statt in Prozentzeichen eingebettet schreiben.
Also z.B. !var! statt %var% oder bei Dir im Batch !ErrorLevel! statt %ErrorLevel%
FOR %%a in (*.txt) do (
fc /b C:\%%a C:\test\%%a
Call :L!ErrorLevel!
)
Sieht zwar ein bisschen kryptisch aus, aber nach zweimal lesen versteht man/frau es.
Unter "set /? " hat M$ versucht, diese Mimik zu erklären. Bitte lies es da noch mal nach.
Ich bin nicht so gut im Erklären. [Edit am 9.10.05] Habe deshalb noch mal oben stilistisch geändert. Sonst eben mehrmals lesen. [/Edit]
HTH Frank / der Biber aus Bremen
P.S. Diesmal schreibe ich es dazu: Ist nur eine ungetestete Skizze!
P.P.S. Ich wäre übrigens dankbar, wenn entweder einer von Euch beiden einen neuen Thread aufmacht, ...
... oder (noch besser) vielleicht auch mal ein paar andere ihre Lösungsvorschläge posten könnten. Ich bin dich nicht der einzige hier, der ein bisschen Batch spricht..
sorry, Denkfehler von mir.
Ich hätte mein eigenes Geschwafel oben lesen sollen, dann hätte ich es gemerkt..*gg
Ich habe es ja selbst geschrieben, der CMD-Interpreter nimmt diese For-Anweisung
FOR %%a in (*.txt) do (
fc /b C:\%%a C:\test\%%a
Call :L%ErrorLevel%
)
als eine Anweisung, als eine Zeile entgegen und führt sie dann aus.
Heißt natürlich, dass er auch, wenn er die -für ihn eine- Anweisung ausführt, natürlich alle darin enthaltenen "normalen*" Variablen auflöst. Einmal auflöst. Nicht bei jeder FOR-Runde..
Auch den %Errorlevel%.......... *sichvornKoppklatscht
(*Außer den Zählvariablen %%a....%%c... die löst er automatisch immer aktuell auf )
Zwei Umgehungsstrategien:
a) die Errorlevel-Abfrage außerhalb der "einen" Zeile legen
FOR %%a in (*.txt) do (
fc /b C:\%%a C:\test\%%a
Call :CheckErrlevel
)
:ChkErrlevel
call :L%ErrorLevel%
goto :eof ...(zurück in die FOR-Schleife)
b)
..oder aber den CMD-Interpreter zur "verspäteten Variablenauflösung" zwingen.
Vor der FOR-Schleife schreiben:
Setlocal EnableDelayedExpansion
und die Variablen, die "verspätet" aufgelöst werden sollen, in Ausrufe-Zeichen statt in Prozentzeichen eingebettet schreiben.
Also z.B. !var! statt %var% oder bei Dir im Batch !ErrorLevel! statt %ErrorLevel%
FOR %%a in (*.txt) do (
fc /b C:\%%a C:\test\%%a
Call :L!ErrorLevel!
)
Sieht zwar ein bisschen kryptisch aus, aber nach zweimal lesen versteht man/frau es.
Unter "set /? " hat M$ versucht, diese Mimik zu erklären. Bitte lies es da noch mal nach.
Ich bin nicht so gut im Erklären. [Edit am 9.10.05] Habe deshalb noch mal oben stilistisch geändert. Sonst eben mehrmals lesen. [/Edit]
HTH Frank / der Biber aus Bremen
P.S. Diesmal schreibe ich es dazu: Ist nur eine ungetestete Skizze!
P.P.S. Ich wäre übrigens dankbar, wenn entweder einer von Euch beiden einen neuen Thread aufmacht, ...
... oder (noch besser) vielleicht auch mal ein paar andere ihre Lösungsvorschläge posten könnten. Ich bin dich nicht der einzige hier, der ein bisschen Batch spricht..