yan2021
Goto Top

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:
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 face-wink

Content-ID: 1934278400

Url: https://administrator.de/contentid/1934278400

Ausgedruckt am: 25.11.2024 um 00:11 Uhr

kreuzberger
kreuzberger 17.02.2022 um 11:02:24 Uhr
Goto Top
Hallo Yan,

die Anführungszeichen kommen immer dann zum Einsatz, wenn Leerzeichen vorkommen.

Kreuzberger
Yan2021
Yan2021 17.02.2022 um 11:30:03 Uhr
Goto Top
Hallo Kreuzberger,

danke Dir...
Aber WO sollten sie dann gesetzt werden?
Oben bei "Set" oder unten im eigentlichen Code?

Und - kannst Du zu den Optionen auch noch was sagen?

Grüße von
Yan face-wink
kreuzberger
kreuzberger 17.02.2022 um 11:54:38 Uhr
Goto Top
Die Anführungszeichen sollten bei Set gesetzt werden. Sonst würde deine Variable nur den Teil in sich beinhalten bis zum ersten Leerzeichen.

Deine Optionen kannst du durchaus so wie du es machst an robocopy übertragen. das sollte so gehen.

Probiere es doch aus mit

echo %Optionen%

Kreuzberger
Yan2021
Yan2021 17.02.2022 aktualisiert um 12:16:48 Uhr
Goto Top
OK, Dein Kommentar zu den Anführungsstrichen leuchtet mir ein face-smile

Das mit dem Versuch mit "echo..." ist eine gute Idee.
Allerdings passiert nichts, wenn ich das so in eine Batch eingebe.
Muss ich sonst noch was eingeben, damit ich eine Echo-Ausgabe erhalte?

Hier mal mein Test-Code:
@ echo off

Set Optionen="/E /MOVE /COPY:DAT /DCOPY:T /XD /MT:12 /R:1 /W:1 /TEE"  

echo %Optionen%

Grüße von
Yan face-wink
Yan2021
Yan2021 17.02.2022 um 12:33:01 Uhr
Goto Top
Habe jetzt mal einen kompletten Verschiebevorgang erstellt.

@ echo off

Set Quelle="S:\DELETE"  
Set Ziel="S:\DELETE\1"  
Set Optionen="/E /MOV /R:1 /W:1 /TEE"  
Set Dateien="*.txt"  
Set Log="S:\DELETE\Log.txt"  

robocopy.exe %Quelle% %Ziel% %Optionen% /LOG+:%Log%

echo.
echo Hier kommt das Echo der Optionen:
echo.
echo %Optionen%
echo.
echo.
pause

Aber das Ergebnis sieht man hier im Screenshot (Log wird auch nicht erstellt!!).
Dort steht "Fehler: Ungültiger Parameter #3"

xxx

Hat Jemand ne Ahnung, worauf sich das bezieht?

Grüße von
Yan face-wink
kreuzberger
kreuzberger 17.02.2022 um 12:56:43 Uhr
Goto Top
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
Yan2021
Yan2021 17.02.2022 aktualisiert um 13:17:27 Uhr
Goto Top
OK, das hat funktioniert.
Wieso es mit Variable nicht geht... keine Ahnung... Habe es eben getestet und wieder der gleiche FEHLER.

Aber mir fiel auch noch auf, dass er jetzt innerhalb des Unterverzeichnisses "Delete\1" nochmal ein Verzeichnis "1" erstellt. Und das passiert bei /MOV und auch bei /MOVE.

Das Optionen-Problem könnte aber aber auch daran gelegen haben, dass ich den Serverpfad falsch angegeben hatte. Jetzt habe ich "\\dasfile2\daten\DELETE" korrekt angegeben.

Grüße von
Yan face-wink
Penny.Cilin
Penny.Cilin 17.02.2022 um 17:59:18 Uhr
Goto Top
Hallo @Yan2021

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%
WinCobold
WinCobold 17.02.2022 um 20:59:16 Uhr
Goto Top
Hallo Yan,

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.

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
Yan2021
Yan2021 18.02.2022 aktualisiert um 08:43:56 Uhr
Goto Top
Hallo @Penny.Cilin und @WinCobold

Danke für Eure Hilfe.
Ich habe zwar nicht alles so wirklich verstanden.

Jedoch habe ich es jetzt so aufgefaßt, dass ich oben bei den SET-Angaben KEINE Anführungsstriche setzen soll... es sei denn, ich habe einen Pfad, der Leerzeichen enthält.

Im eigentlichen Ausführungs-Code (robocopy.exe.....) würde ich aber dann auch keine Anführungsstriche setzen, da sie - wenn benötigt - ja schon bei SET gesetzt wurden... richtig? face-wink

Und die Angabe für die Dateien (z.B. *.txt) müßte auch keine Anführungsstriche enthalten?

Z.B. so:
Set Quelle=S:\DELETE
Set Ziel="S:\DELETE Nummer 55\1"  
Set Optionen=/E /MOV /R:1 /W:1 /TEE
Set Dateien=*.txt
Set Log=S:\DELETE\Log.txt

robocopy.exe %Quelle% %Ziel% %Optionen% /LOG+:%Log%

Im Beispiel habe ich lediglich bei Set Ziel die Anführungsstriche gesetzt, da der Pfad Leerstellen enthält.
Unten im eigentlichen Ausführungs-Code habe ich dann nirgendwo Anführungsstriche gesetzt.

Wäre das so korrekt?

Aber zur Info:

Der Code für einen Testaufbau, den ich gestern gemacht habe, hat aber funktioniert. Dort habe ich die Optionen jedoch NICHT als Variable eingesetzt:

Set 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%

Wie Ihr seht, habe ich bei SET alles in Anführungsstriche gesetzt und unten im Ausführungs-Code nichts.
Vielleicht versteht Ihr jetzt, dass das alles etwas verwirrend ist face-wink

Grüße von
Yan face-wink
1915348599
1915348599 18.02.2022 aktualisiert um 12:30:05 Uhr
Goto Top
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 aus
Set "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%"  
Yan2021
Yan2021 21.02.2022 um 09:48:11 Uhr
Goto Top
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. Und dann zusätzlich noch unten im eigentlichen Ausführungs-Code...

Kannst Du hierzu auch eine Quelle nennen? Ich würde mir das gerne mal anschauen... habe jedenfalls keine Quelle gefunden, die das so beschreibt, wie Du es hier angegeben hast.

Hättest Du auch noch einen Tipp bezüglich Set "Optionen"?
Das habe ich ja überhaupt nicht hinbekommen.

Grüße von
Yan face-wink
1915348599
1915348599 21.02.2022 aktualisiert um 10:29:00 Uhr
Goto Top
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.
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 haben

Kannst Du hierzu auch eine Quelle nennen?
Das ist quasi Batch Grundlage die generelle Funktionsweise von Anführungszeichen und Set
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 😉

set "optionen=bla blub whatever"  

Robocopy ........ %optionen%
Yan2021
Yan2021 21.02.2022 aktualisiert um 13:41:48 Uhr
Goto Top
Danke Dir für die weiteren Tipps.

Ich hatte das Thema "PowerShell" : "Batch" hier schon einige Male face-wink

Tue mich sehr schwer mit PS und diesen Vorgang, den ich jetzt per Robocopy umgesetzt habe, hatte ich ursprünglich mit PS umsetzen sollen. Aber das hat nicht funktioniert. Jetzt mit Robocopy (in einer Batch) funktioniert es prima.

Ich habe sogar schon sehr viele Batchdateien mit Robocopy umgesetzt.
Nur hatte ich bisher nie diese Set-Parameter genutzt. Ich habe einfach den Ausführungscode ganz normal hinter "robocopy...." geschrieben. Aber zur besseren Überschaubarkeit ist das mit den Set-Angaben (Variablen) schon erheblich besser face-smile

Mein Code funktioniert ja jetzt und damit bin ich im Moment ja auch zufrieden.

Eine Frage noch zu den Optionen:

Kann ich die komplette Zeile (außer den einzelnen Variablen) dort mit angeben?
Z.B. so:

Set "Optionen=/E /MOVE /COPY:DAT /DCOPY:T /XD "%Ausschluss%" /minage:20120101 /MT:12 /R:1 /W:1 /TEE /LOG+:"%Log%"  

robocopy.exe........... %Optionen%

Oder müßte ich auch das %Ausschluss% sowie das %Log% weglassen?
Wie würde die korrekte Zeile aussehen?

Grüße von
Yan face-wink
WinCobold
WinCobold 22.02.2022 um 18:33:50 Uhr
Goto Top
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
Yan2021
Yan2021 23.02.2022 um 08:20:10 Uhr
Goto Top
Hallo WinCobold,

mit der Echo-Ausgabe ist eine gute Idee.
Habe eben mal den folgenden Code durchlaufen lassen:

@ echo off

Set "Optionen=/E /MOVE /COPY:DAT /DCOPY:T /XD "%Ausschluss%" /minage:20120101 /MT:12 /R:1 /W:1 /TEE /LOG+:"%Log%""  

echo "%Optionen%"  

echo.
pause

Das Ergebnis war wie folgt:

"/E /MOVE /COPY:DAT /DCOPY:T /XD "" /minage:20120101 /MT:12 /R:1 /W:1 /TEE /LOG+:"""  

Lasse ich die beiden Anführungsstriche unten bei der Echo-Ausgabe weg, dann ist das Ergebnis so:

/E /MOVE /COPY:DAT /DCOPY:T /XD "" /minage:20120101 /MT:12 /R:1 /W:1 /TEE /LOG+:""  

Hier fehlt nur vorne und hinten je ein Anführungszeichen (also genau die Beiden, die ich ja auch weggelassen habe).
Mir ist die zweite Variante - sagen wir sympathischer face-wink
Funktionieren würden wohl Beide.

Also bedeutet mein Test, dass ich die Optionen genau so in meinem Code eingeben könnte, wie oben (egal ob mit oder ohne zusätzlichen Anführungsstrichen im eigentlichen Ausführungscode)... richtig?

Grüße von
Yan face-wink