Mit Robocopy aus Batchdatei werden neuerdings Laufwerkfehler angezeigt - warum?
Hallo Administrator.de-Mitglieder,
bislang hatte ich mit zwei Batch-Dateien mit dem Befehl Robocopy ein wichtiges Verzeichnis auf meiner Festplatte mit einem Netzwerkverzeichnis oder mit einem USB-Stick synchronisiert.
Als ich mir vor drei Wochen mit dem brandneuen und noch fehlerhaften Kaspersky 2014 meine Userrechte zerschossen hatte, setzte ich mein Notebook Dell Vostro 3450 (14''-Bildschirm) mit 64-bit und Windows 7 Professional vollkommen neu auf. In den Explorer-Ordneroptionen deaktiviere ich neuerdings das Häkchen für "Leere Laufwerke im Ordner Computer ausblenden. Ich lasse im Navigationsbereich "Alle Ordner anzeigen" und "Automatisch auf aktuellen Ordner erweitern".
Seitdem zeigt mir meine Synchronisations-Batch eine von cmd/win ausgehende Fehlermeldung an:
Der folgende Code entspricht der Synchronisation der neueren Dateien von USB-Stick zur Festplatte:
Ich konnte das Problem jetzt umgehen, indem ich die Laufwerke der Sticks einen Buchstaben hochsetzte. Aber falls die Frage nicht zu trivial ist, oder zu umständlich: Kann mir jemand die Fehlermeldung erklären? Kann ich E: trotzdem durchsuchen lassen, falls mal die Laufwerke anders sortiert oder ein Laufwerk von Windows ausgelassen wird?
Vielen Dank im Voraus fürs Lesen und für jeden Beitrag!
Gruß,
red-eye
bislang hatte ich mit zwei Batch-Dateien mit dem Befehl Robocopy ein wichtiges Verzeichnis auf meiner Festplatte mit einem Netzwerkverzeichnis oder mit einem USB-Stick synchronisiert.
Als ich mir vor drei Wochen mit dem brandneuen und noch fehlerhaften Kaspersky 2014 meine Userrechte zerschossen hatte, setzte ich mein Notebook Dell Vostro 3450 (14''-Bildschirm) mit 64-bit und Windows 7 Professional vollkommen neu auf. In den Explorer-Ordneroptionen deaktiviere ich neuerdings das Häkchen für "Leere Laufwerke im Ordner Computer ausblenden. Ich lasse im Navigationsbereich "Alle Ordner anzeigen" und "Automatisch auf aktuellen Ordner erweitern".
Seitdem zeigt mir meine Synchronisations-Batch eine von cmd/win ausgehende Fehlermeldung an:
Der folgende Code entspricht der Synchronisation der neueren Dateien von USB-Stick zur Festplatte:
:: Überprüfung der Verzeichnisse
if exist E:\autorun.inf (set source="E:\ME" & goto var_chk) else (set source=0)
if exist F:\autorun.inf (set source="G:\ME" & goto var_chk) else (set source=0)
if exist "C:\Users\USER\Documents\ME" (
set destin="C:\Users\USER\Documents\ME"
) else (set destin=0)
:var_chk
if not %source%==0 (goto src_ok) else (goto src_fe)
:src_ok
if not %destin%==0 (goto s_d_ok) else (goto dst_fe)
:src_fe
if not %destin%==0 (goto dst_ok) else (goto s_d_fe)
:s_d_ok
goto rbc_show
:dst_fe
echo Ziel nicht vorhanden: Stick nicht eingesteckt oder nicht erkannt!
goto fehler
:dst_ok
echo Quelle nicht vorhanden: Vermutlich falsches Synchronisationsprogramm!
goto fehler
:s_d_fe
echo Quelle und Ziel nicht vorhanden: Vermutlich falsches Synchronisationsprogramm!
goto fehler
:: Robocopy listet zuerst Unterschiede der Verzeichnisse auf
:rbc_show
choice /c jn /t 90 /d n /m "M”chten Sie eine Liste der Unterschiede erhalten? "
if errorlevel 255 goto fehler
if errorlevel 2 goto wahl_syn
if errorlevel 1 goto robo_lst
if errorlevel 0 goto wahl_syn
goto fehler
:robo_lst
robocopy %source% %destin% /mir /xo /fft /r:3 /w:10 /l
pause
:: Synchronicity fragt ab, ob die Synchronisation erfolgen soll
:wahl_syn
choice /c jn /t 90 /d n /m "Soll nun eine Synchronisation durchgefhrt werden? "
if errorlevel 255 goto fehler
if errorlevel 2 goto abbruch
if errorlevel 1 goto wahl_del
if errorlevel 0 goto abbruch
goto fehler
:: Synchronicity fragt, ob die *Extra Dateien auf dem Ziellaufwerk erhalten werden sollen
:wahl_del
choice /c jn /t 90 /d j /m "Wollen Sie in Quelle gel”schte Dateien in Ziel behalten? "
if errorlevel 255 goto fehler
if errorlevel 2 goto start_dl
if errorlevel 1 goto start_kp
if errorlevel 0 goto abbruch
goto fehler
:: Robocopy kopiert ohne Löschen der *Extra Dateien im Ziellaufwerk
:start_kp
robocopy %source% %destin% /e /xo /fft /r:3 /w:10
goto ende
:: Robocopy kopiert und löscht *Extra Dateien im Ziellaufwerk
:start_dl
robocopy %source% %destin% /mir /xo /fft /r:3 /w:10
goto ende
:: Ende-Prozeduren
:abbruch
echo Synchronisation abgebrochen
goto ende_
:fehler
echo Synchronisation wegen eines Fehlers nicht gestartet, Programm beendet.
goto ende_
:ende
echo Synchronicity erfolgreich beendet.
:ende_
pause
Vielen Dank im Voraus fürs Lesen und für jeden Beitrag!
Gruß,
red-eye
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 218779
Url: https://administrator.de/contentid/218779
Ausgedruckt am: 25.11.2024 um 15:11 Uhr
9 Kommentare
Neuester Kommentar
Moin red-eye,
Die Fehler-MessageBox erscheint, weil der Befehlsinterpreter vor dem Zugriff auf das Laufwerk nicht auf ein Vorhandenes gültiges eingebundenes Medium (Volume) prüft.
Eine ExistensPrüfung mit if grätscht da leider genauso wie die Erweiterungen von ForVariablen und Batchparametern.
Eine Prüfung auf ein eingebundenes Medium (E: ) erfolgt in der CMD-Line mit
Oder, was in Deinem Fall mit DIR direkt mit Autorun.inf
Warum machst Du diese Überprüfungen am Anfang nur halb und doppelt? Etwas chronologisch wäre es in etwa so:
Gruß Phil
Die Fehler-MessageBox erscheint, weil der Befehlsinterpreter vor dem Zugriff auf das Laufwerk nicht auf ein Vorhandenes gültiges eingebundenes Medium (Volume) prüft.
Eine ExistensPrüfung mit if grätscht da leider genauso wie die Erweiterungen von ForVariablen und Batchparametern.
Eine Prüfung auf ein eingebundenes Medium (E: ) erfolgt in der CMD-Line mit
vol E: >nul 2>nul && echo Laufwerk E: ist online
for /f "delims=\ " %v in ('mountvol ^|find ":\"^|sort') do @vol %v >nul 2>nul&&echo Laufwerk %v mit Medium
dir E:\autorun.inf >nul &&echo USB Stick ist E:
for /f "tokens=2delims==\" %v in ('wmic volume where "drivetype=2" get name /format:list^|find "="') do @dir %v\Autoupdateslog.txt >nul 2>nul &&echo USB Stick ist %v
Warum machst Du diese Überprüfungen am Anfang nur halb und doppelt? Etwas chronologisch wäre es in etwa so:
:: Überprüfung der Verzeichnisse
rem etwas einfacher Gestaltet
set "source="
set "destin="
set "USBpaht="
for /f "tokens=2delims==\" %%v in ('wmic volume where "drivetype=2" get name /format:list^|find "="') do vol %v >nul 2>nul &&call set "USBpaht=%%USBpath%%%v\;"
rem Suche nach autorun.inf
for %%i in (autorun.inf) do (
if %%~d$USBpath:i equ E: set source="%%~d$USBpath:i\ME"
rem warum hier eigentlich LW G:?
if %%~d$USBpath:i equ F: set source="G:\ME"
)
if exist "C:\Users\USER\Documents\ME" set destin="C:\Users\USER\Documents\ME"
rem prüfe parameter var_chk
if not defined source if not defined destin (goto s_d_fe) else goto s_fe
if defined destin goto rbc_show
rem :dst_fe
echo Ziel nicht vorhanden: Stick nicht eingesteckt oder nicht erkannt!
goto fehler
:s_fe
echo Quelle nicht vorhanden: Vermutlich falsches Synchronisationsprogramm!
goto fehler
:s_d_fe
echo Quelle und Ziel nicht vorhanden: Vermutlich falsches Synchronisationsprogramm!
goto fehler
:: Robocopy listet zuerst Unterschiede der Verzeichnisse auf
:rbc_show
rem hier gehts weiter
Gruß Phil
Hi,
man kann- mit ordentlichem Aufwand- Windows überreden, ausgehend von "Verbatim" das logische Laufwerk auszugeben:
Wenn mehrere Verbatim-Laufwerke angeschlossen sind, würde ich über
lg.
man kann- mit ordentlichem Aufwand- Windows überreden, ausgehend von "Verbatim" das logische Laufwerk auszugeben:
@ECHO OFF &SETLOCAL
for /f "delims=" %%a in ('wmic path win32_diskdrive where 'model like "%%Verbatim%%"' get deviceid /value') do (
for /f "tokens=2delims==" %%b in ("%%~a") do set "diskdrive=%%b"
)
for /f tokens^=7delims^=^" %%a in ('wmic path win32_diskdrivetodiskpartition get /FORMAT:CSV ^| FIND "%diskdrive%"') do set "partition=%%a"
for /f tokens^=7delims^=^" %%a in ('wmic path win32_logicaldisktopartition get /FORMAT:CSV ^| FIND "%partition%"') do set "drive=%%a"
echo %drive%
label
eindeutige Namen vergeben und die mit vol
abfragen.lg.
Moin red-eye,
mountvol listet nur die lokal eingebundenen Laufwerke auf, wmic nur die USB Laufwerke, anstatt eine Liste von A-Z durchzugehen wird schon ausgefiltert.
Dein Test in Zeile 4
hast Du etwas falsch übernommen ->> copy paste Fehler?
Es sollte sicher so aussehen:
Die Ausgabe des Verwaltungintrumentes (wmic) wird in der Forschleife mit "tokens=2" dazu angewisen das zweite vorkommen inerhalb des/der delimiter(s) "=\" "delims==\" in der Variable %v auszugeben.
Der Befehl Vol erwartet nur eine Laufwerksbezeichnung gefolgt von einen Doppelpunkt, sonst nichts. wird etwas anderes Hinzugefügt interpretiert die CommanLine dies als keine Eingabe, da diese Syntax nicht erwartet wird. Also wird laut vol /? das Aktuelle Laufwerk angezeigt.
Theoretisch würde es auch so etwas umständlich wen der VolumeName des Laufwerkes VERBATIM16 ist, gehen:
In einer Autorun.inf kannst Du auch noch ganz speziell ein Label vergeben und nach einer gewissen Zeichenfolge suchen. Der Möglichkeiten gibt es noch viele mehr
um einen Bestimmten Datenträger ausfindig zu machen; siehe: @Endoro
So ganz nebenbei: Von wo aus wird denn das Backkup angestossen?
@Friemler hat unter Wissen ein schönes For-Tutorial verfasst.
In der Befehlszeilenreferenz kannst Du Dir die Erklärungen genauer durchlesen.
Gruß Phil
Wenn ich Euch richtig verstehe, dann sucht Ihr mit einem Systembefehl nach vorhandenen Laufwerken, in der Hoffnung, daß die Fehlermeldung nicht aufkommt. Bei Endoros erstem Lösungsversuch geschah das leider trotzdem. Bei Phils Vorschlag entsteht leider ein anderer Fehler.
Nein - der Befehl vol oder der Befehl dir verhindern das Auftreten der Fehlermeldung mittels Messagebox, was aber mit der Standardfehlerausgabe (Handle 2) der CMD-Line nichts zu tun hat.mountvol listet nur die lokal eingebundenen Laufwerke auf, wmic nur die USB Laufwerke, anstatt eine Liste von A-Z durchzugehen wird schon ausgefiltert.
Dein Test in Zeile 4
C:\Windows\system32>for /F "tokens=2delims==\" %v in ('wmic volume where "drivetype=2" get name /format:list|find "="') do vol %v\;"
for /f "tokens=2delims==\" %%v in ('wmic volume where "drivetype=2" get name /format:list^|find "="') do vol %v >nul 2>nul &&call set "USBpaht=%%USBpath%%%v\;"
for /f "tokens=2delims==\" %%v in ('wmic volume where "drivetype=2" get name /format:list^|find "="') do vol %v
Der Befehl Vol erwartet nur eine Laufwerksbezeichnung gefolgt von einen Doppelpunkt, sonst nichts. wird etwas anderes Hinzugefügt interpretiert die CommanLine dies als keine Eingabe, da diese Syntax nicht erwartet wird. Also wird laut vol /? das Aktuelle Laufwerk angezeigt.
Theoretisch würde es auch so etwas umständlich wen der VolumeName des Laufwerkes VERBATIM16 ist, gehen:
for %L in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do vol %L: 2>nul |findstr /ec": ist VERBATIM16" >nul &&set "LW=%L:"
um einen Bestimmten Datenträger ausfindig zu machen; siehe: @Endoro
So ganz nebenbei: Von wo aus wird denn das Backkup angestossen?
@Friemler hat unter Wissen ein schönes For-Tutorial verfasst.
vol D: >nul 2>nul &&echo Laufwerk D: ist vorhanden ||echo Laufwerk D: ist ohne Medium
In der Befehlszeilenreferenz kannst Du Dir die Erklärungen genauer durchlesen.
Gruß Phil