Zeichenkettenzerlegung in For-Schleife
Hallo,
ich hoffe ihr könnt mir bei meinem kleinen Problem helfen. Es geht um folgendes. Ich möchte in einem Windows-Batch-Skript zwei Ordner mittels robocopy "synchronisieren". Es sollen alle xml-Dateien vom ersten in den zweiten Ordner kopiert werden. Dabei darf keine Datei überschrieben werden. Das ganze habe ich auch soweit schon fertig, nur fehlt ein kleiner Teil. Aber vielleicht erst einmal mein Skript:
Leider wird beim Auslesen des Datainamens aus dem kompletten Pfad immer nur der Dateiname der letzten Datei gelesen. Ich habe mich da mal schlau gelesen. Dies soll eine Eigenschaft der Batch-Programmierung sein. Aber wie kann man das umgehen?
Noch eine kleine Anmerkung am Rande: Ich weiß, dass man mit robocopy das Skript auch als einen einzigen Befehl darstellen kann, jedoch soll es noch erweitert werden, dass nach jeder einzelnen kopierten Datei bestimmte Befehle ausgeführt werden.
Für eine Lösung wäre ich sehr dank bar.
Gruß
rodgerwilco
ich hoffe ihr könnt mir bei meinem kleinen Problem helfen. Es geht um folgendes. Ich möchte in einem Windows-Batch-Skript zwei Ordner mittels robocopy "synchronisieren". Es sollen alle xml-Dateien vom ersten in den zweiten Ordner kopiert werden. Dabei darf keine Datei überschrieben werden. Das ganze habe ich auch soweit schon fertig, nur fehlt ein kleiner Teil. Aber vielleicht erst einmal mein Skript:
@echo off
rem Dies ist das Quellverzeichnis (ohne "\" am Ende)
set strQuelle=d:\quelle
rem Nach hier werden die Daten gesichert (ohne "\" am Ende)
set strZiel=d:\ziel
rem Schleife über alle xml-Dateien im Quellverzeichnis und Aufruf von
rem Robocopy zur Speicherung im Ziel ohne Überschreiben.
for %%f in (%strQuelle%\*.xml) do (
echo -------------------------
echo Kopiere %%f nach %strQuelle%
rem Lies Dateinamen aus kompletten Pfad aus.
set sFullname=%%f
for %%i in ("%sFullname%") do set sFILE=%%~ni%%~xi
echo robocopy %strQuelle% %strZiel% %sFILE% /XC /XN /XO
)
Noch eine kleine Anmerkung am Rande: Ich weiß, dass man mit robocopy das Skript auch als einen einzigen Befehl darstellen kann, jedoch soll es noch erweitert werden, dass nach jeder einzelnen kopierten Datei bestimmte Befehle ausgeführt werden.
Für eine Lösung wäre ich sehr dank bar.
Gruß
rodgerwilco
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 107248
Url: https://administrator.de/contentid/107248
Ausgedruckt am: 25.11.2024 um 23:11 Uhr
3 Kommentare
Neuester Kommentar
Hallo rodgerwilco!
Natürlich macht die Verwendung von Variablen einen Code besser lesbar, aber hier sind die in den "for"-Schleifen erstellten Variablen zunächst einmal hinderlich - wenn Du sie weg lässt, sollte es eigentlich klappen (es folgt nur der relevante Teil):
Sollen diese Variablen dennoch verwendet werden, müsstest Du entweder "delayedExpansion" einsetzen oder die jeweilge Verarbeitung in einem Unterprogramm (welches sich dann wie ein eigener Batch verhält - der ankommende Parameter ist also %1) erledigen - als Beispiel für Letzteres:
Grüße
bastla
Natürlich macht die Verwendung von Variablen einen Code besser lesbar, aber hier sind die in den "for"-Schleifen erstellten Variablen zunächst einmal hinderlich - wenn Du sie weg lässt, sollte es eigentlich klappen (es folgt nur der relevante Teil):
rem Schleife über alle xml-Dateien im Quellverzeichnis und Aufruf von
rem Robocopy zur Speicherung im Ziel ohne Überschreiben.
for %%f in (%strQuelle%\*.xml) do (
echo -------------------------
echo Kopiere %%f nach %strQuelle%
echo robocopy %strQuelle% %strZiel% %%~nxf /XC /XN /XO
)
rem Schleife über alle xml-Dateien im Quellverzeichnis und Aufruf von
rem Robocopy zur Speicherung im Ziel ohne Überschreiben.
for %%f in (%strQuelle%\*.xml) do call :ProcessFile "%%f"
::
:: hier bei Bedarf nach Bearbeitung aller Dateien weitere Anweisungen
::
:: und hier ist das Ende des Batches
goto :eof
:ProcessFile
set "sFULLNAME=%~f1"
set "sFILE=%~nx1"
echo -------------------------
echo Kopiere %sFULLNAME% nach %strQuelle%
echo robocopy %strQuelle% %strZiel% %sFILE% /XC /XN /XO
::
:: hier bei Bedarf für jede einzelne Datei weitere Anweisungen
::
:: und hier ist Schluss (des Unterprogrammes und damit) mit der Bearbeitung der Datei
goto :eof
bastla
Hallo rodgerwilco!
Vielleicht so:
Ansonsten bitte genauere Fehlerbeschreibung posten ...
bzw auch für die anderen Befehle jeweils "Befehl /?" zum Aufrufen der Online-Hilfe.
Grüße
bastla
Vielleicht so:
if NOT exist "%strZiel%\%%~nxf" (
echo -------------------------
echo Kopiere %%f nach %strQuelle%
robocopy "%strQuelle%" "%strZiel%" "%%~nxf" /XC /XN /XO
rem Warte x Sekunden
sleep %zeit%
)
wo ich die Bedeutungen von "%%~nxf" und dergleichen nachlesen kann.
for /?
Grüße
bastla