Discussion:
Robocopy in Batch-Datei
(zu alt für eine Antwort)
Anselm Rapp
2011-06-07 10:43:17 UTC
Permalink
Hallo,

"Hier werden Sie geholfen" ist gefährlich - für die Helfer. Ich habe ein
neues Problem.

Im Vorfeld meines immer wieder hinausgeschobenen Umstiegs auf Windows 7
habe ich beschlossen, die Verzeichnisse in meinen etlichen Batch-Dateien
und Office-Makros durch Variable zu ersetzen, damit ich nach dem Umzug
nur einmal pro Verzeichnis die Variable und nicht mehrmals die
Verzeichnisse ändern muss. Dabei tut sich folgendes Problem in
Zusammenhang mit Robocopy auf:

Das

robocopy R:\psrbackups\ L:\Backup\ intern*.psx /MAXAGE:7

funktioniert.

Das

set PSaRPVz="R:\psrbackups\"
set BackupVz="L:\Backup\"
robocopy %PSaRPVz% %BackupVz% intern*.psx /MAXAGE:7

bewirkt die Meldung

ERROR : No Destination Directory Specified.

ECHO gibt aus

robocopy "R:\psrbackups\" "L:\Backup\" intern*.psx /MAXAGE:7

also Anführungszeichen um die Verzeichnisnamen, aber wenn ich den Befehl
so direkt starte, funktioniert es auch.

Mit anderen Variablennamen, Verzeichnissen und Dateispezifikation

set Vz1="C:\temp"
set VZ2="C:\WINDOWS\Temp"
robocopy %Vz1% %Vz2% *.txt /MAXAGE:7

funktioniert es.

Jetzt fällt mir nur noch ein: R: ist mein zweites internes Laufwerk, L:
ist ein USB-Stick. Ob das mit letzterem zusammenhängen kann?

Wieder mal danke im Voraus,

Anselm
--
Bitte in der Newsgroup antworten.
Ueli Lezzi
2011-06-07 11:14:19 UTC
Permalink
Post by Anselm Rapp
Das
robocopy R:\psrbackups\ L:\Backup\ intern*.psx /MAXAGE:7
funktioniert.
Das
set PSaRPVz="R:\psrbackups\"
set BackupVz="L:\Backup\"
robocopy %PSaRPVz% %BackupVz% intern*.psx /MAXAGE:7
bewirkt die Meldung
ERROR : No Destination Directory Specified.
ECHO gibt aus
robocopy "R:\psrbackups\" "L:\Backup\" intern*.psx /MAXAGE:7
also Anführungszeichen um die Verzeichnisnamen, aber wenn ich den Befehl
so direkt starte, funktioniert es auch.
Mit anderen Variablennamen, Verzeichnissen und Dateispezifikation
set Vz1="C:\temp"
set VZ2="C:\WINDOWS\Temp"
robocopy %Vz1% %Vz2% *.txt /MAXAGE:7
funktioniert es.
Vermutlich wird '\"' speziell interpretiert, und zwar vermutlich von
robocopy.

- Ueli
--
NOTIZ: '_STOP_', '_TAFEL_' und '.invalid' beachten und allenfalls
entfernen...
Anselm Rapp
2011-06-07 11:34:47 UTC
Permalink
Post by Ueli Lezzi
Post by Anselm Rapp
Das
set PSaRPVz="R:\psrbackups\"
set BackupVz="L:\Backup\"
robocopy %PSaRPVz% %BackupVz% intern*.psx /MAXAGE:7
bewirkt die Meldung
ERROR : No Destination Directory Specified.
[...]
Vermutlich wird '\"' speziell interpretiert, und zwar vermutlich von
robocopy.
Danke auch Dir,

Anselm
--
Bitte in der Newsgroup antworten.
Uwe Sieber
2011-06-07 10:55:59 UTC
Permalink
Post by Anselm Rapp
robocopy R:\psrbackups\ L:\Backup\ intern*.psx /MAXAGE:7
funktioniert.
set PSaRPVz="R:\psrbackups\"
set BackupVz="L:\Backup\"
robocopy %PSaRPVz% %BackupVz% intern*.psx /MAXAGE:7
bewirkt die Meldung
ERROR : No Destination Directory Specified.
Das dürfte an der eigenwilligen Interpretation der
Kommandozeile liegen, die Microsofts C-Lib betreibt:
http://msdn.microsoft.com/en-us/library/a1y7w461.aspx

'A double quotation mark preceded by a backslash, \", is
interpreted as a literal double quotation mark (").

Das Problem ist also der Backslash vor dem Anführungszeichen.

Bei Pfaden in Umgebungsvariable macht man auch generell
keine Anführungszeichen - die werden schließlich oft als
Teilpfade benutzt, da sind die nur im Wege.

set XXX=C:\Program Files
funktioniert z.B. korrekt - trotz Leerzeichens sind keine
Aunführungszeichen nötig.
Post by Anselm Rapp
ECHO gibt aus
robocopy "R:\psrbackups\" "L:\Backup\" intern*.psx /MAXAGE:7
also Anführungszeichen um die Verzeichnisnamen, aber wenn ich den Befehl
so direkt starte, funktioniert es auch.
Sicher? Glaube ich nicht.
Post by Anselm Rapp
Mit anderen Variablennamen, Verzeichnissen und Dateispezifikation
set Vz1="C:\temp"
set VZ2="C:\WINDOWS\Temp"
robocopy %Vz1% %Vz2% *.txt /MAXAGE:7
funktioniert es.
Ja, kein Backslash am Ende der Pfade, schon gehts.


Gruß Uwe
Anselm Rapp
2011-06-07 11:33:10 UTC
Permalink
Post by Uwe Sieber
Post by Anselm Rapp
robocopy R:\psrbackups\ L:\Backup\ intern*.psx /MAXAGE:7
funktioniert.
set PSaRPVz="R:\psrbackups\"
set BackupVz="L:\Backup\"
robocopy %PSaRPVz% %BackupVz% intern*.psx /MAXAGE:7
bewirkt die Meldung
ERROR : No Destination Directory Specified.
[...]
set XXX=C:\Program Files
funktioniert z.B. korrekt - trotz Leerzeichens sind keine
Aunführungszeichen nötig.
Und ich dachte, die Anführungszeichen seien zwingend erforderlich.
Post by Uwe Sieber
Post by Anselm Rapp
ECHO gibt aus
robocopy "R:\psrbackups\" "L:\Backup\" intern*.psx /MAXAGE:7
also Anführungszeichen um die Verzeichnisnamen, aber wenn ich den
Befehl so direkt starte, funktioniert es auch.
Sicher? Glaube ich nicht.
Ich wollte Dir triumphierend den Inhalt der DOS-Box kopieren. Ich war
sicher, kann es aber nicht reproduzieren und gebe Dir Recht.
Post by Uwe Sieber
Post by Anselm Rapp
Mit anderen Variablennamen, Verzeichnissen und Dateispezifikation
set Vz1="C:\temp"
set VZ2="C:\WINDOWS\Temp"
robocopy %Vz1% %Vz2% *.txt /MAXAGE:7
funktioniert es.
Ja, kein Backslash am Ende der Pfade, schon gehts.
In der Tat, vielen Dank. Ich habe geraume Zeit experimentiert, bevor ich
hier angefragt habe.

Gruß, Anselm
--
Bitte in der Newsgroup antworten.
Hermann
2011-06-07 12:58:24 UTC
Permalink
Post by Anselm Rapp
Ich habe geraume Zeit experimentiert, bevor ich
hier angefragt habe.
Es gibt eine GUI für Robocopy. Unten im Fenster "Save Script"
anhaken. Robocopy erstellt dann anhand der Optionen ein wie-
derverwendbares Script.

http://technet.microsoft.com/de-de/magazine/2006.11.utilityspotlight.aspx
http://download.microsoft.com/download/f/d/0/fd05def7-68a1-4f71-8546-25c359cc0842/UtilitySpotlight2006_11.exe
http://technet.microsoft.com/en-us/library/cc733145(WS.10).aspx

Gruß

Hermann
Joachim Reiter
2011-06-07 14:06:06 UTC
Permalink
Post by Hermann
Post by Anselm Rapp
Ich habe geraume Zeit experimentiert, bevor ich
hier angefragt habe.
Es gibt eine GUI für Robocopy. Unten im Fenster "Save Script"
anhaken. Robocopy erstellt dann anhand der Optionen ein wie-
derverwendbares Script.
http://technet.microsoft.com/de-de/magazine/2006.11.utilityspotlight.aspx
http://download.microsoft.com/download/f/d/0/fd05def7-68a1-4f71-8546-25c359cc0842/UtilitySpotlight2006_11.exe
http://technet.microsoft.com/en-us/library/cc733145(WS.10).aspx
ACK - nach meiner hier (NG) schon gestellten Anfrage zu RC habe ich mir
dieses feine /Ding/ inzwischen auch geholt.
Allein anhand der Schalter erkennt man schon den Nutzen und die
Möglichkeiten von und mit RC - ohne Hilfedatei zu lesen. :-)

Möchte natürlich trotzdem nicht allein "robocopy /?" in Frage stellen, das
ebenso schon etliche Infos leistet!
--
Hättest Du mal lieber die Klappe gehalten...
...als Du prahltest, ein so toller Aufreißer zu sein...
...und deine Freunde dich dann beim ersten Date mit einem
Aufklärungsbuch erwischen
Anselm Rapp
2011-06-08 09:30:34 UTC
Permalink
Post by Hermann
Es gibt eine GUI für Robocopy. Unten im Fenster "Save Script"
anhaken. Robocopy erstellt dann anhand der Optionen ein wie-
derverwendbares Script.
[...]
Das habe ich schon vor längerer Zeit installiert, aber nicht benützt,
weil ich es in Zusammenhang mit Batch-Dateien für nur begrenzt hilfreich
hielt. Für die Parameter braucht man die ROBOCOPY.doc genauso wie /? bei
der Befehlszeile. Aber das "Save Script" ist mir entgangen, und das
dürfte zu den interessantesten Funktionen gehören, weil man so einfach
zu syntaktisch korrekten Befehlszeilen gelangt.

Ein besonderer Lerneffekt dabei: Das Robocopy GUI erzeugt mein Beispiel so:

robocopy "R:\psrbackups" "L:\Backup" intern*.psx /MAXAGE:7

Das Problem waren also nicht die Anführungszeichen an sich, sondern der
Backslash vor dem schließenden Anführungszeichen. Das war mir bisher
nicht bewusst geworden.

Noch mal danke,

Anselm
--
Bitte in der Newsgroup antworten.
Stefan Kanthak
2011-06-09 21:18:51 UTC
Permalink
Post by Uwe Sieber
Post by Anselm Rapp
robocopy R:\psrbackups\ L:\Backup\ intern*.psx /MAXAGE:7
funktioniert.
set PSaRPVz="R:\psrbackups\"
set BackupVz="L:\Backup\"
robocopy %PSaRPVz% %BackupVz% intern*.psx /MAXAGE:7
bewirkt die Meldung
ERROR : No Destination Directory Specified.
Das dürfte an der eigenwilligen Interpretation der
http://msdn.microsoft.com/en-us/library/a1y7w461.aspx
'A double quotation mark preceded by a backslash, \", is
interpreted as a literal double quotation mark (").
Das Problem ist also der Backslash vor dem Anführungszeichen.
Nicht zwingend!

%SystemRoot%\System32\find.exe /i "\system32\" %SystemRoot%\Inf\*.inf

Stefan
[
--
Die unaufgeforderte Zusendung werbender E-Mails verstoesst gegen §823
Abs. 1 sowie §1004 Abs. 1 BGB und begruendet Anspruch auf Unterlassung.
Beschluss des OLG Bamberg vom 12.05.2005 (AZ: 1 U 143/04)
Uwe Sieber
2011-06-10 07:06:22 UTC
Permalink
Post by Stefan Kanthak
Post by Uwe Sieber
Post by Anselm Rapp
robocopy R:\psrbackups\ L:\Backup\ intern*.psx /MAXAGE:7
funktioniert.
set PSaRPVz="R:\psrbackups\"
set BackupVz="L:\Backup\"
robocopy %PSaRPVz% %BackupVz% intern*.psx /MAXAGE:7
bewirkt die Meldung
ERROR : No Destination Directory Specified.
Das dürfte an der eigenwilligen Interpretation der
http://msdn.microsoft.com/en-us/library/a1y7w461.aspx
'A double quotation mark preceded by a backslash, \", is
interpreted as a literal double quotation mark (").
Das Problem ist also der Backslash vor dem Anführungszeichen.
Nicht zwingend!
%SystemRoot%\System32\find.exe /i "\system32\" %SystemRoot%\Inf\*.inf
Was hat find mit RoboCopy zu tun? Jedes Programm kann
die Kommandozeile parsen wie es will. Wenn es auf
Microsofts C-Lib zurückgreift, dann gibts das Problem
mit dem Backslash vor Anführungszeichen (ja, zwingend),
sonst hängt es von der genutzten Implementierung ab.
Da bei kaum ein Programm dran steht "Commandline parsed
by MS C-Lib", vermeidet man einfach den Backslash am Ende.
Wenn man ihn unbedingt braucht, das Problem aber
auftritt, doppelt man ihn und macht so auch die C-Lib
glücklich :-)

Gruß Uwe
Stefan Kanthak
2011-06-10 16:34:49 UTC
Permalink
Post by Uwe Sieber
Post by Stefan Kanthak
Post by Uwe Sieber
http://msdn.microsoft.com/en-us/library/a1y7w461.aspx
'A double quotation mark preceded by a backslash, \", is
interpreted as a literal double quotation mark (").
Das Problem ist also der Backslash vor dem Anführungszeichen.
Nicht zwingend!
%SystemRoot%\System32\find.exe /i "\system32\" %SystemRoot%\Inf\*.inf
Was hat find mit RoboCopy zu tun? Jedes Programm kann
die Kommandozeile parsen wie es will.
Sehr gut erkannt.
Nur: warum? Gibt's keine Standardfunktion(en) dafuer?
Post by Uwe Sieber
Wenn es auf
Microsofts C-Lib zurückgreift, dann gibts das Problem
mit dem Backslash vor Anführungszeichen (ja, zwingend),
sonst hängt es von der genutzten Implementierung ab.
Genau.
Post by Uwe Sieber
Da bei kaum ein Programm dran steht "Commandline parsed
by MS C-Lib",
Und jetzt hast Du mein Argument verstanden...
Post by Uwe Sieber
vermeidet man einfach den Backslash am Ende.
Oder verwendet in der Eingabeaufforderung ein Konstrukt wie ...\^"
Post by Uwe Sieber
Wenn man ihn unbedingt braucht, das Problem aber
auftritt, doppelt man ihn und macht so auch die C-Lib
glücklich :-)
Soviel zur konsistenten Interpretation der Kommandozeile unter MS-DOS
und Nachfolgern.

Stefan
[
--
Die unaufgeforderte Zusendung werbender E-Mails verstoesst gegen §823
Abs. 1 sowie §1004 Abs. 1 BGB und begruendet Anspruch auf Unterlassung.
Beschluss des OLG Bamberg vom 12.05.2005 (AZ: 1 U 143/04)
Uwe Sieber
2011-06-14 07:12:11 UTC
Permalink
Post by Stefan Kanthak
Post by Uwe Sieber
Post by Stefan Kanthak
Post by Uwe Sieber
http://msdn.microsoft.com/en-us/library/a1y7w461.aspx
'A double quotation mark preceded by a backslash, \", is
interpreted as a literal double quotation mark (").
Das Problem ist also der Backslash vor dem Anführungszeichen.
Nicht zwingend!
%SystemRoot%\System32\find.exe /i "\system32\" %SystemRoot%\Inf\*.inf
Was hat find mit RoboCopy zu tun? Jedes Programm kann
die Kommandozeile parsen wie es will.
Sehr gut erkannt.
Nur: warum? Gibt's keine Standardfunktion(en) dafuer?
Das Verhalten der MS-C-Lib führt nun mal zu diesem
'überraschenden' Verhalten, das zu diesem Thread
geführt hat. Und wenns bei den Parametern um Dateinamen
und Pfade geht, kann man das durch selbst gebautes
Parsen der Kommandozeile vermeiden - in Dateinamen
und Pfaden sind Anführungszeichen schließlich nicht
erlaubt.
Umso überraschender, dass ausgerechnent find hier
was eigenes benutzt - hier können ja Anführungszeichen
im Parameter durchaus gewollt sein. Nach sowas wie
"asdf"
kann man mit find offenbar nicht suchen.

find ""asdf"" text.txt
sagt
Datei ASDF nicht gefunden

find "\"asdf\""
sagt
Zugriff verweigert - \

Alles merkwürdig :-)
Post by Stefan Kanthak
Post by Uwe Sieber
vermeidet man einfach den Backslash am Ende.
Oder verwendet in der Eingabeaufforderung ein Konstrukt wie ...\^"
Kenne ich nicht - was macht das ^ ?


Gruß Uwe
Stefan Kanthak
2011-06-14 17:29:22 UTC
Permalink
Post by Uwe Sieber
Post by Stefan Kanthak
Post by Uwe Sieber
Post by Stefan Kanthak
Post by Uwe Sieber
http://msdn.microsoft.com/en-us/library/a1y7w461.aspx
'A double quotation mark preceded by a backslash, \", is
interpreted as a literal double quotation mark (").
Das Problem ist also der Backslash vor dem Anführungszeichen.
Nicht zwingend!
%SystemRoot%\System32\find.exe /i "\system32\" %SystemRoot%\Inf\*.inf
Was hat find mit RoboCopy zu tun? Jedes Programm kann
die Kommandozeile parsen wie es will.
Sehr gut erkannt.
Nur: warum? Gibt's keine Standardfunktion(en) dafuer?
Oooch Uwe, das ist doch eine rhetorische Frage.-P
Post by Uwe Sieber
Das Verhalten der MS-C-Lib führt nun mal zu diesem
'überraschenden' Verhalten, das zu diesem Thread
geführt hat. Und wenns bei den Parametern um Dateinamen
und Pfade geht, kann man das durch selbst gebautes
Parsen der Kommandozeile vermeiden - in Dateinamen
und Pfaden sind Anführungszeichen schließlich nicht
erlaubt.
Umso überraschender, dass ausgerechnent find hier
was eigenes benutzt - hier können ja Anführungszeichen
im Parameter durchaus gewollt sein. Nach sowas wie
"asdf"
kann man mit find offenbar nicht suchen.
find.exe """asdf""" funktioniert hier seit Jahren.-P
Post by Uwe Sieber
find ""asdf"" text.txt
sagt
Datei ASDF nicht gefunden
""asdf"" muesste fuer CMD.EXE eigentlich die Konkatenation
<leere Zeichenkette> "asdf" <leere Zeichenkette> sein, wird
aber wohl literal an das gestartete Kommando uebergeben.
Post by Uwe Sieber
find "\"asdf\""
sagt
Zugriff verweigert - \
"\"asdf"\" muesste die Konkatenation '\' "asdf\" <leere Zeichenkette>
sein, wird aber wohl ebenso literal an das gestartete Kommando
uebergeben.
Post by Uwe Sieber
Alles merkwürdig :-)
Genau. CMD.EXE und die Kommandozeilenverarbeitung unter Windows sind
sehr komische Biester!
Post by Uwe Sieber
Post by Stefan Kanthak
Post by Uwe Sieber
vermeidet man einfach den Backslash am Ende.
Oder verwendet in der Eingabeaufforderung ein Konstrukt wie ...\^"
Kenne ich nicht - was macht das ^ ?
Das ist das Escape-Zeichen von COMMAND.COM und CMD.EXE.

Stefan
[
--
Die unaufgeforderte Zusendung werbender E-Mails verstoesst gegen §823
Abs. 1 sowie §1004 Abs. 1 BGB und begruendet Anspruch auf Unterlassung.
Beschluss des OLG Bamberg vom 12.05.2005 (AZ: 1 U 143/04)
Stefan Kanthak
2011-06-07 16:11:36 UTC
Permalink
Post by Anselm Rapp
set PSaRPVz="R:\psrbackups\"
set BackupVz="L:\Backup\"
robocopy %PSaRPVz% %BackupVz% intern*.psx /MAXAGE:7
(Nicht nur) fuer Windows ungeeignete Konstruktion:

SET braucht keine Anfuehrungszeichen!

Richtig ist:

set PSaRPVz=R:\psrbackups\
set BackupVz=L:\Backup\
"%SystemRoot%\System32\robocopy.exe" "%PSaRPVz%" "%BackupVz%" intern*.psx /MAXAGE:7

d.h. Du verwendest die Anfuehrungszeichen an den Stellen, wo Du
Variablen referenzierst. IMMER. Und zwar nicht um jede einzelne
Variable, sondern um die damit zusammengebastelten Zeichenketten.

Und wenn Du Batch-Skripte aufrufst, dann verwendest Du in diesen
"%~1" etc. Siehe CALL /?

Stefan
[
--
Die unaufgeforderte Zusendung werbender E-Mails verstoesst gegen §823
Abs. 1 sowie §1004 Abs. 1 BGB und begruendet Anspruch auf Unterlassung.
Beschluss des OLG Bamberg vom 12.05.2005 (AZ: 1 U 143/04)
Anselm Rapp
2011-06-08 09:40:05 UTC
Permalink
Post by Stefan Kanthak
Post by Anselm Rapp
set PSaRPVz="R:\psrbackups\"
set BackupVz="L:\Backup\"
robocopy %PSaRPVz% %BackupVz% intern*.psx /MAXAGE:7
SET braucht keine Anfuehrungszeichen!
Siehe aber <***@mid.individual.net> an Hermann bezüglich des
von Robocopy GUI erzeugten Skripts.
Post by Stefan Kanthak
set PSaRPVz=R:\psrbackups\
set BackupVz=L:\Backup\
"%SystemRoot%\System32\robocopy.exe" "%PSaRPVz%" "%BackupVz%" intern*.psx /MAXAGE:7
d.h. Du verwendest die Anfuehrungszeichen an den Stellen, wo Du
Variablen referenzierst. IMMER. Und zwar nicht um jede einzelne
Variable, sondern um die damit zusammengebastelten Zeichenketten.
Gut.
Post by Stefan Kanthak
Und wenn Du Batch-Skripte aufrufst, dann verwendest Du in diesen
"%~1" etc. Siehe CALL /?
Das ist Neuland für mich. Danke für den Hinweis. Es wird mir nicht
langweilig ...

Gruß, Anselm
--
Bitte in der Newsgroup antworten.
Lesen Sie weiter auf narkive:
Loading...