batch Ordner vergleichen
bearbeitet von
Hallo whine,
eigentlich hast Du alle Bausteine.
Mit ein paar Ergänzungen:
1. `for /f "delims=" %%a in ('dir /a-d /b "%eps%\*.*"')`
Dieser Befehl ruft DIR auf, um eine Verzeichnisliste zu erstellen, und interpretiert dann die Ausgabe von DIR. Das ist aber von hinten durch die Brust ins Auge, sowas kann FOR ganz alleine. Es ist dann auch hilfreich, die Suche auf Dateien mit eps-Extension zu begrenzen.
So geht's: `FOR %%a in ("%eps%\*.eps") DO ...`
%%a enthält nun nacheinander die EPS-Dateinamen, inclusive Pfad.
Beachte, dass `FOR /F %%a IN ("*.eps") DO` etwas **ganz** anderes ist als `FOR %%a in ("*.eps") DO`. Die /F Option bewirkt, dass Datein nicht aufgelistet werden, sondern ihr Inhalt eingelesen, und wenn dann die IN Angabe in "Anführungszeichen" steht, wird sie nicht als Dateiname sondern als einfacher Text interpretiert. Steht sie in 'einfachen' Anführungszeichen, wird sie als CMD-Befehl interpretiert, dessen Standardausgabe dann gelesen wird. Ohne Anführungszeichen wird ein Dateiname (ohne Muster) erwartet.
Ohne /F muss die IN Angabe ein oder mehrere Dateimuster enthalten, und dann dienen die doppelten Anführungszeichen dazu, Leerstellen in Dateinamen darstellen zu können. `FOR %%a IN (a1.eps a2.eps)` verarbeitet zwei Dateien. `FOR %%a IN ("a1.eps a2.eps")` verarbeitet **eine** Datei mit Namen "a1.eps a2.eps".
Eine Anleitung zum FOR Befehl bekommst Du auf der Windows Befehlszeile mit HELP FOR, oder [hier](https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/for). Vergiss die deutsche Version, die scheint maschinell übersetzt.
2. Zerlegen von Dateinamen
Da hast Du schon den richtigen Ansatz, aber `%%~a` ist unvollständig. Wenn `%%a` ein for-Parameter ist, dann aktiviert `%%~a` die Zerlegungsoptionen, aber ohne weitere Parameter entfernt es nur eventuell vorhandene Anführungszeichen. Das ist bei FOR überflüssig weil da nie Anführungszeichen kommen.
Was Du brauchst, ist `%%~na`. n steht für Name. Entscheidend ist, dass da kein p (für Pfad) und kein x (für eXtension) steht. Aus `C:\EPS_FILES\FOO.EPS` wird mit diesen Modifiziereren `FOO`, und da musst Du für den EXIST Test nur noch .svg dahinterschreiben.
~~~cmd
FOR %%a in ("%eps%\*.eps") do (
IF NOT EXIST "%svg%\%%~na.svg COPY "%%a" "%result%"
)
~~~
Der FOR Befehl ist ein extrem zickiges Biest, ich weiß. Und er ist seit seine Erfindung in frühen MS DOS Versionen nur zickiger geworden. Allein schon die doppelten Anführungszeichen für die FOR Variable sind nervig, aber das ist der CMD Syntax geschuldet, die Variablen mit einfachen % schon auflöst bevor der ausgeführte Befehl die Variable auch nur zu sehen bekommt. Man schreibt %%, weil das der CMD-Weg ist um die Variablenauflösung zu umgehen und ein einzelnes % zu bekommen. Und dieses wird dann vom FOR Befehl als Parameter-Marker verwendet. Deswegen schreibt man, wenn man FOR von Hand auf der Befehlszeile ausführt, FOR %a IN (...) DO statt FOR %%a IN (...). Aber wer macht sowas schon außer ein paar Hardcore-Batchern aus den 80er Jahren 😂
Die Alternative zu CMD ist Powershell, aber da hat man eine noch steilere Lernkurve als bei CMD zu erklimmen...
_Rolf_
--
sumpsi - posui - obstruxi
batch Ordner vergleichen
bearbeitet von
Hallo whine,
eigentlich hast Du alle Bausteine.
Mit ein paar Ergänzungen:
1. `for /f "delims=" %%a in ('dir /a-d /b "%eps%\*.*"')`
Dieser Befehl ruft DIR auf, um eine Verzeichnisliste zu erstellen, und interpretiert dann die Ausgabe von DIR. Das ist aber von hinten durch die Brust ins Auge, sowas kann FOR ganz alleine. Es ist dann auch hilfreich, die Suche auf Dateien mit eps-Extension zu begrenzen.
So geht's: `FOR %%a in ("%eps%\*.eps") DO ...`
%%a enthält nun nacheinander die EPS-Dateinamen, inclusive Pfad.
Eine Anleitung zum FOR Befehl bekommst Du auf der Windows Befehlszeile mit HELP FOR, oder [hier](https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/for). Vergiss die deutsche Version, die scheint maschinell übersetzt.
2. Zerlegen von Dateinamen
Da hast Du schon den richtigen Ansatz, aber `%%~a` ist unvollständig. Wenn `%%a` ein for-Parameter ist, dann aktiviert `%%~a` die Zerlegungsoptionen, aber ohne weitere Parameter entfernt es nur eventuell vorhandene Anführungszeichen. Das ist bei FOR überflüssig weil da nie Anführungszeichen kommen.
Was Du brauchst, ist `%%~na`. n steht für Name. Entscheidend ist, dass da kein p (für Pfad) und kein x (für eXtension) steht. Aus `C:\EPS_FILES\FOO.EPS` wird mit diesen Modifiziereren `FOO`, und da musst Du für den EXIST Test nur noch .svg dahinterschreiben.
~~~cmd
FOR %%a in ("%eps%\*.eps") do (
IF NOT EXIST "%svg%\%%~na.svg COPY "%%a" "%result%"
)
~~~
Der FOR Befehl ist ein extrem zickiges Biest, ich weiß. Und er ist seit seine Erfindung in frühen MS DOS Versionen nur zickiger geworden. Allein schon die doppelten Anführungszeichen für die FOR Variable sind nervig, aber das ist der CMD Syntax geschuldet, die Variablen mit einfachen % schon auflöst bevor der ausgeführte Befehl die Variable auch nur zu sehen bekommt. Man schreibt %%, weil das der CMD-Weg ist um die Variablenauflösung zu umgehen und ein einzelnes % zu bekommen. Und dieses wird dann vom FOR Befehl als Parameter-Marker verwendet. Deswegen schreibt man, wenn man FOR von Hand auf der Befehlszeile ausführt, FOR %a IN (...) DO statt FOR %%a IN (...). Aber wer macht sowas schon außer ein paar Hardcore-Batchern aus den 80er Jahren 😂
Die Alternative zu CMD ist Powershell, aber da hat man eine noch steilere Lernkurve als bei CMD zu erklimmen...
_Rolf_
--
sumpsi - posui - obstruxi