Robocopy Optionen als Variable und wo Anführungsstriche setzen?
Hallo,
ich habe in einem anderen Thread ein Robocopy-Script erstellt zum Verschieben von Dateien, die vor einem bestimmten Datum zuletzt geändert wurden.
Das Script funktioniert...
Dennoch habe ich 2 Fragen, die mich beschäftigen, die aber nichts mit der grundsätzlichen Funktion von Robocopy zu tun haben. Daher hier ein extra Thread.
Hier die beiden Fragen:
1) Im Internet steht in vielen Berichten, dass man bei den Variablen hinter "Set xxx=" keine Anführungsstriche im angegebenen Pfad einfügen soll. Diese soll man dann erst im eigentlichen Robocopy-Befehl angeben. Ich habe es jedoch so umgesetzt, dass ich oben bei "Set xxx=" die Anführungsstriche im anschließenden Pfad gesetzt habe und unten im eigentlichen Befehlscode nicht. Offenbar funktioniert Beides.
Hier mal je ein Beispiel beider Varianten:
Gibt es dennoch einen Unterschied oder ist es wirklich egal, wie man es macht?
2) Kann ich die Optionen auch als Variable mit "set" angeben?
Ich habe lange im Internet danach gesucht, aber leider keine Infos dazu gefunden...
Beispiel:
Dann wäre der eigentliche Befehlscode später übersichtlicher...
Oder sollte man das aus irgend einem Grund nicht machen?
Grüße von,
Yan
ich habe in einem anderen Thread ein Robocopy-Script erstellt zum Verschieben von Dateien, die vor einem bestimmten Datum zuletzt geändert wurden.
Das Script funktioniert...
Dennoch habe ich 2 Fragen, die mich beschäftigen, die aber nichts mit der grundsätzlichen Funktion von Robocopy zu tun haben. Daher hier ein extra Thread.
Hier die beiden Fragen:
1) Im Internet steht in vielen Berichten, dass man bei den Variablen hinter "Set xxx=" keine Anführungsstriche im angegebenen Pfad einfügen soll. Diese soll man dann erst im eigentlichen Robocopy-Befehl angeben. Ich habe es jedoch so umgesetzt, dass ich oben bei "Set xxx=" die Anführungsstriche im anschließenden Pfad gesetzt habe und unten im eigentlichen Befehlscode nicht. Offenbar funktioniert Beides.
Hier mal je ein Beispiel beider Varianten:
Set Quelle="\\dasfile2\daten"
Set Quelle=\\dasfile2\daten
%Quelle%
"%Quelle%"
Gibt es dennoch einen Unterschied oder ist es wirklich egal, wie man es macht?
2) Kann ich die Optionen auch als Variable mit "set" angeben?
Ich habe lange im Internet danach gesucht, aber leider keine Infos dazu gefunden...
Beispiel:
Set Optionen="/E /MOVE /COPY:DAT /DCOPY:T /XD /MT:12 /R:1 /W:1 /TEE"
robocopy.exe %Quelle% %Ziel% %Optionen% /LOG+:%Log%
Dann wäre der eigentliche Befehlscode später übersichtlicher...
Oder sollte man das aus irgend einem Grund nicht machen?
Grüße von,
Yan
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 1934278400
Url: https://administrator.de/contentid/1934278400
Ausgedruckt am: 25.11.2024 um 00:11 Uhr
16 Kommentare
Neuester Kommentar
Dein Dateifilter wird gar nicht an Robocop übergeben.
Probiere doch erst mal die Optionen ohne Batch-Variable zu übergeben.
Siehe auch:
https://theether.net/download/Microsoft/Utilities/robocopy.pdf
Kreuzberger
Probiere doch erst mal die Optionen ohne Batch-Variable zu übergeben.
Siehe auch:
https://theether.net/download/Microsoft/Utilities/robocopy.pdf
Kreuzberger
Hallo @Yan2021
folgend Auszüge von einem meiner Robocopy Skripte:
Setzen von Variablen
Code für Logdateien erste Zeile für Test, zweite Zeile fürs kopieren
Ausführung von Robocopy
folgend Auszüge von einem meiner Robocopy Skripte:
Setzen von Variablen
Set SRCDRV=S:
Set SRCDIR=\
Set TGTDRV=T:
Set TGTDIR=\
Set LOGDRV=C:
Set LOGDIR=Data\LOG
Set EXCLDIR=$RECYCLE.BIN RECYCLER "Automatisch zu iTunes hinzufügen" "System Volume Information"
Set EXCLFIL=autorun.inf Desktop.ini Drive.ico more4you.ico
Set PPARAMS=/V /X /S /E /Copy:DAT /DST /TS /FP /NP /XD %EXCLDIR% /XF %EXCLFIL% /R:10 /W:0 /Tee
Set TPARAMS=%PPARAMS% /L
Code für Logdateien erste Zeile für Test, zweite Zeile fürs kopieren
REM Mit Parameter /L ==> Kopiervorgang wird nur simuliert.
Set LOGFILE=%LOGDRV%\%LOGDIR%\%REVDATE%_%ACTTIME%_%~n0_Test.log
REM Kopieren
Set LOGFILE=%LOGDRV%\%LOGDIR%\%REVDATE%_%ACTTIME%_%~n0.log
Ausführung von Robocopy
REM Logdatei für Testmodus
RoboCopy %SRCDRV%%SRCDIR% %TGTDRV%\ %TPARAMS% /LOG:%LOGFILE%
REM Logdatei für Kopiervorgang
RoboCopy %SRCDRV%\ %TGTDRV%%TGTDIR% %PPARAMS% /LOG:%LOGFILE%
Hallo Yan,
Das ist schlicht und einfach falsch. Die Variable enthält aber die Anführungszeichen, wenn du sie so angibst wie oben. Und das ist genau dein Problem beim von dir ausprobierten Robocopy: Du übergibst einen Text in Anführungszeichen, und damit kann Robocopy natürlich nichts anfangen, und die Log-Option wird dann gar nicht mehr analysiert. Ohne Anführungszeichen müsste es gehen.
Anführungszeichen benötigst du, wenn du einen Pfad oder einen Dateinamen mit Leerstellen übergeben willst. Und da kann es sinnvoll sein, den SET erst mal ohne Anführungszeichen zu verwenden, dann kannst du nämlich Pfad und Dateinamen zusammensetzen und erst danach die Anführungszeichen ergänzen.
Gruß vom
WinCobold
Zitat von @kreuzberger:
Die Anführungszeichen sollten bei Set gesetzt werden. Sonst würde deine Variable nur den Teil in sich beinhalten bis zum ersten Leerzeichen.
Die Anführungszeichen sollten bei Set gesetzt werden. Sonst würde deine Variable nur den Teil in sich beinhalten bis zum ersten Leerzeichen.
Das ist schlicht und einfach falsch. Die Variable enthält aber die Anführungszeichen, wenn du sie so angibst wie oben. Und das ist genau dein Problem beim von dir ausprobierten Robocopy: Du übergibst einen Text in Anführungszeichen, und damit kann Robocopy natürlich nichts anfangen, und die Log-Option wird dann gar nicht mehr analysiert. Ohne Anführungszeichen müsste es gehen.
Anführungszeichen benötigst du, wenn du einen Pfad oder einen Dateinamen mit Leerstellen übergeben willst. Und da kann es sinnvoll sein, den SET erst mal ohne Anführungszeichen zu verwenden, dann kannst du nämlich Pfad und Dateinamen zusammensetzen und erst danach die Anführungszeichen ergänzen.
Gruß vom
WinCobold
1) Im Internet steht in vielen Berichten, dass man bei den Variablen hinter "Set xxx=" keine Anführungsstriche im angegebenen Pfad einfügen soll. Diese soll man dann erst im eigentlichen Robocopy-Befehl angeben.
Best practice für das Setzen von Anführungszeichen via set und bei Verwenden von Variablen sieht so ausSet "Quelle=\\dasfile2\daten\DELETE"
Set "Ziel=\\dasfile2\daten\DELETE2"
Set "Dateien=*.doc* *.xls*"
Set "Ausschluss=\\dasfile2\daten\DELETE\1\1U"
Set "Log=\\dasfile2\daten\DELETE2\LOG.txt"
robocopy.exe "%Quelle%" "%Ziel%" %Dateien% /E /MOVE /COPY:DAT /DCOPY:T /XD "%Ausschluss%" /minage:20120101 /MT:12 /R:1 /W:1 /TEE /LOG+:"%Log%"
Zitat von @Yan2021:
Hallo @1915348599
Danke für den Hinweis.
Du hast die Anführungsstriche ja sogar noch vor den Begriff "Quelle" oder "Ziel" gesetzt.
Jepp.Hallo @1915348599
Danke für den Hinweis.
Du hast die Anführungsstriche ja sogar noch vor den Begriff "Quelle" oder "Ziel" gesetzt.
Das habe ich noch nie gesehen.
Dann hast du noch nie Batch geschrieben 🙂Und dann zusätzlich noch unten im eigentlichen Ausführungs-Code...
Jepp, weil die im Set als erstes mal Sonderzeichen und Leerzeichen maskieren so damit sie auch komplett zur Variable gehören ohne daß sie unerwünschte Effekte habenKannst Du hierzu auch eine Quelle nennen?
https://ss64.com/nt/syntax-esc.html
https://docs.microsoft.com/en-us/windows-server/administration/windows-c ...
Btw. Würde ich gar nicht mehr erst anfangen mit, lerne lieber gleich PowerShell wenn's Winblows sein muss ... Batch hat so viele Bugs aus vergangenen Tagen ...
Hättest Du auch noch einen Tipp bezüglich Set "Optionen"?
Das habe ich ja überhaupt nicht hinbekommen.
Genau so wie oben nur das du keine Anführungszeichen im Robocopy Befehl setzen darfst weil die CMD sonst denkt das alle Optionen eine einzige sind 😉Das habe ich ja überhaupt nicht hinbekommen.
set "optionen=bla blub whatever"
Robocopy ........ %optionen%
Hallo Yan,
warum probierst du es nicht einfach aus? Dir fehlt zwar ein Anführungszeichen, aber ich denke, dass es (zumindest in diesem Fall) trotzdem funktionieren müsste. Wenn hinter "%Log%" noch etwas käme, würde das aber wohl ohne das fehlende Anführungszeichen abgeschnitten werden.
Eigentlich ist es ganz einfach: Alle Variablen im SET werden aufgelöst, und das Ergebnis genau so gespeichert, wie du es angegeben hast. Und bei der Verwendung wird auch alles so aufgelöst, wie es gespeichert wurde. Wenn du also eine Variable als Parameter oder Option angibst, muss der aufgelöste Wert eben gültig sein. Mit ECHO kannst du das immer überprüfen.
Gruß vom
WinCobold
warum probierst du es nicht einfach aus? Dir fehlt zwar ein Anführungszeichen, aber ich denke, dass es (zumindest in diesem Fall) trotzdem funktionieren müsste. Wenn hinter "%Log%" noch etwas käme, würde das aber wohl ohne das fehlende Anführungszeichen abgeschnitten werden.
Eigentlich ist es ganz einfach: Alle Variablen im SET werden aufgelöst, und das Ergebnis genau so gespeichert, wie du es angegeben hast. Und bei der Verwendung wird auch alles so aufgelöst, wie es gespeichert wurde. Wenn du also eine Variable als Parameter oder Option angibst, muss der aufgelöste Wert eben gültig sein. Mit ECHO kannst du das immer überprüfen.
Gruß vom
WinCobold