Batch zum autom. Kopieren von Daten auf Speicherkarten
"Verbesserungshilfe" für mein Script zum automatischen Kopieren bestimmter Dateien von Speicherkarten mittels Card Reader
Hallo,
für einen Kunden habe ich eine kleine Batch geschrieben, welche nach einstecken eines Cardreaders mit Speicherkarte (z.B. Micro-SD von Handys oder anderen Flashs von Fotoapperaten) nur ausgeführt werden braucht und dann "automatisch" alle in der Batch vorher deklarierten Dateien (z.B. jpg, bmp, 3gp und mpg) in einen in der Batch festgelegten Ordner auf der HD kopiert. Der Kunde benutzt einen Windows XP Rechner. Das Script läuft auch einwandfrei in der gleich gezeigten Version.
Es hat nur ein kleines Manko, wo ich noch keine Lösung gefunden habe - näheres dazu in Punkt 2 und eben mein Hauptanliegen, dass es eine kleine "Schönheits-OP benötigt - siehe Punkt 1.
Hier erstmal das Script:
Punkt 1:
Ich habe versucht, die ganzen "if errorlevel" Abfragen der einzelnen Laufwerke und Dateiendungen (in diesem Fall habe ich 3 verschiedene Dateiendungen, die bearbeitet werden) in eine einzige for-Schleife zu packen in der Art:
Wenn ich das so mache, kommt dann beim Programmaufruf in der Eingabeaufforderung bei echo on nach der Abfrage von ZIELVERZEICHNIS sowas wie:
"%i" ist an dieser Stelle syntaktisch nicht verarbeitbar.
Meine Frage zu Punkt 1 ist also:
Wie kann ich das Programm verkürzen und alles in eine bzw zwei for-Schleifen packen, so dass ich bei Bedarf einfach nur in der Klammer der einen Schleife Laufwerksbuchstaben und in der anderen Schleife Dateiendungen hinzufügen/entfernen kann, ohne das an ganz vielen Stellen im Programm zu machen.
Nur als Beispiel: Wenn ich 8 Dateitypen kopieren lassen will, dann muss ich acht Jump-Point Verbände erstellen, also z.b. E1-K1, E2-K2, E3-K3 - E8-K8...
Das macht das Programm RIESIG und Änderungen sehr zeitaufwendig.
Punkt 2:
Ich habe ausserdem das Problem, dass ich bei ZIELVERZEICHNIS keinen Pfad mit Leerzeichen zuweisen darf, z.B. "D:\Eigene Dateien\Bilder" oder so.
Das wird dann nur bis "D:\Eigene" verarbeitet. Ich habe versucht die for-Schleife der einzelnen Kopierbefehle daraufhin umzubauen, dass das ZIELVERZEICHNIS mit Kurz-Namen benutzt wird, aber das hab ich nicht hinbekommen. Etwa so in der Art:
Ich hoffe, irgendwer von euch kann mir da weiterhelfen
MfG
Dark
Hallo,
für einen Kunden habe ich eine kleine Batch geschrieben, welche nach einstecken eines Cardreaders mit Speicherkarte (z.B. Micro-SD von Handys oder anderen Flashs von Fotoapperaten) nur ausgeführt werden braucht und dann "automatisch" alle in der Batch vorher deklarierten Dateien (z.B. jpg, bmp, 3gp und mpg) in einen in der Batch festgelegten Ordner auf der HD kopiert. Der Kunde benutzt einen Windows XP Rechner. Das Script läuft auch einwandfrei in der gleich gezeigten Version.
Es hat nur ein kleines Manko, wo ich noch keine Lösung gefunden habe - näheres dazu in Punkt 2 und eben mein Hauptanliegen, dass es eine kleine "Schönheits-OP benötigt - siehe Punkt 1.
Hier erstmal das Script:
@echo off & setlocal
set ZIELVERZEICHNIS=
IF "%ZIELVERZEICHNIS%"=="" goto HINWEIS
set ENDUNG=jpg
set VAR=E
dir %VAR%:\
IF errorlevel 1 goto F
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:F
cls
set VAR=F
dir %VAR%:\
IF errorlevel 1 goto G
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:G
cls
set VAR=G
dir %VAR%:\
IF errorlevel 1 goto H
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:H
cls
set VAR=H
dir %VAR%:\
IF errorlevel 1 goto I
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:I
cls
set VAR=I
dir %VAR%:\
IF errorlevel 1 goto J
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:J
cls
set VAR=J
dir %VAR%:\
IF errorlevel 1 goto K
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:K
cls
set VAR=K
dir %VAR%:\
IF errorlevel 1 goto E2
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:E2
cls
set ENDUNG=bmp
set VAR=E
dir %VAR%:\
IF errorlevel 1 goto F2
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:F2
cls
set VAR=F
dir %VAR%:\
IF errorlevel 1 goto G2
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:G2
cls
set VAR=G
dir %VAR%:\
IF errorlevel 1 goto H2
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:H2
cls
set VAR=H
dir %VAR%:\
IF errorlevel 1 goto I2
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:I2
cls
set VAR=I
dir %VAR%:\
IF errorlevel 1 goto J2
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:J2
cls
set VAR=J
dir %VAR%:\
IF errorlevel 1 goto K2
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:K2
cls
set VAR=K
dir %VAR%:\
IF errorlevel 1 goto E3
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:E3
cls
set ENDUNG=mpg
set VAR=E
dir %VAR%:\
IF errorlevel 1 goto F3
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:F3
cls
set VAR=F
dir %VAR%:\
IF errorlevel 1 goto G3
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:G3
cls
set VAR=G
dir %VAR%:\
IF errorlevel 1 goto H3
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:H3
cls
set VAR=H
dir %VAR%:\
IF errorlevel 1 goto I3
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:I3
cls
set VAR=I
dir %VAR%:\
IF errorlevel 1 goto J3
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:J3
cls
set VAR=J
dir %VAR%:\
IF errorlevel 1 goto K3
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:K3
cls
set VAR=K
dir %VAR%:\
IF errorlevel 1 goto FERTIG
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:FERTIG
dir %ZIELVERZEICHNIS%\%date%
IF errorlevel 1 goto FEHLER
set ANZAHL=0
FOR %%i in (%ZIELVERZEICHNIS%\%date%\*) do set /a ANZAHL+=1
if "%ANZAHL%"=="0" goto NODATA
goto ERFOLG
:NODATA
cls
echo.
echo F E H L E R
echo.
echo Keine Dateien zum kopieren gefunden!
echo.
rmdir %ZIELVERZEICHNIS%\%date%
pause
exit
:ERFOLG
cls
echo.
echo E R F O L G R E I C H
echo.
echo %ANZAHL% Datei(en) nach %ZIELVERZEICHNIS%\%date% kopiert!
echo.
pause
exit
:FEHLER
cls
echo.
echo F E H L E R
echo.
echo Keine Speicherkarte gefunden!
echo.
pause
exit
:HINWEIS
echo.
echo P R O G R A M M F E H L E R
echo.
echo Variable "ZIELVERZEICHNIS" nicht definiert!
echo.
pause
exit
set ZIELVERZEICHNIS=
IF "%ZIELVERZEICHNIS%"=="" goto HINWEIS
set ENDUNG=jpg
set VAR=E
dir %VAR%:\
IF errorlevel 1 goto F
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:F
cls
set VAR=F
dir %VAR%:\
IF errorlevel 1 goto G
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:G
cls
set VAR=G
dir %VAR%:\
IF errorlevel 1 goto H
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:H
cls
set VAR=H
dir %VAR%:\
IF errorlevel 1 goto I
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:I
cls
set VAR=I
dir %VAR%:\
IF errorlevel 1 goto J
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:J
cls
set VAR=J
dir %VAR%:\
IF errorlevel 1 goto K
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:K
cls
set VAR=K
dir %VAR%:\
IF errorlevel 1 goto E2
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:E2
cls
set ENDUNG=bmp
set VAR=E
dir %VAR%:\
IF errorlevel 1 goto F2
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:F2
cls
set VAR=F
dir %VAR%:\
IF errorlevel 1 goto G2
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:G2
cls
set VAR=G
dir %VAR%:\
IF errorlevel 1 goto H2
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:H2
cls
set VAR=H
dir %VAR%:\
IF errorlevel 1 goto I2
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:I2
cls
set VAR=I
dir %VAR%:\
IF errorlevel 1 goto J2
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:J2
cls
set VAR=J
dir %VAR%:\
IF errorlevel 1 goto K2
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:K2
cls
set VAR=K
dir %VAR%:\
IF errorlevel 1 goto E3
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:E3
cls
set ENDUNG=mpg
set VAR=E
dir %VAR%:\
IF errorlevel 1 goto F3
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:F3
cls
set VAR=F
dir %VAR%:\
IF errorlevel 1 goto G3
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:G3
cls
set VAR=G
dir %VAR%:\
IF errorlevel 1 goto H3
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:H3
cls
set VAR=H
dir %VAR%:\
IF errorlevel 1 goto I3
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:I3
cls
set VAR=I
dir %VAR%:\
IF errorlevel 1 goto J3
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:J3
cls
set VAR=J
dir %VAR%:\
IF errorlevel 1 goto K3
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:K3
cls
set VAR=K
dir %VAR%:\
IF errorlevel 1 goto FERTIG
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
:FERTIG
dir %ZIELVERZEICHNIS%\%date%
IF errorlevel 1 goto FEHLER
set ANZAHL=0
FOR %%i in (%ZIELVERZEICHNIS%\%date%\*) do set /a ANZAHL+=1
if "%ANZAHL%"=="0" goto NODATA
goto ERFOLG
:NODATA
cls
echo.
echo F E H L E R
echo.
echo Keine Dateien zum kopieren gefunden!
echo.
rmdir %ZIELVERZEICHNIS%\%date%
pause
exit
:ERFOLG
cls
echo.
echo E R F O L G R E I C H
echo.
echo %ANZAHL% Datei(en) nach %ZIELVERZEICHNIS%\%date% kopiert!
echo.
pause
exit
:FEHLER
cls
echo.
echo F E H L E R
echo.
echo Keine Speicherkarte gefunden!
echo.
pause
exit
:HINWEIS
echo.
echo P R O G R A M M F E H L E R
echo.
echo Variable "ZIELVERZEICHNIS" nicht definiert!
echo.
pause
exit
Punkt 1:
Ich habe versucht, die ganzen "if errorlevel" Abfragen der einzelnen Laufwerke und Dateiendungen (in diesem Fall habe ich 3 verschiedene Dateiendungen, die bearbeitet werden) in eine einzige for-Schleife zu packen in der Art:
@echo off & setlocal
set ZIELVERZEICHNIS=
IF "%ZIELVERZEICHNIS%"=="" goto HINWEIS
FOR i%% in (jpg, bmp, 3gp) do
(
set ENDUNG=i%%
FOR j%% in (E, F, G, H, I, J, K) do
(
set VAR=j%%
dir %VAR%:\
IF errorlevel 1 goto FERTIG
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
)
)
ab hier dann die ganzen Jump-Points Hinweis, Fertig etc pp.
set ZIELVERZEICHNIS=
IF "%ZIELVERZEICHNIS%"=="" goto HINWEIS
FOR i%% in (jpg, bmp, 3gp) do
(
set ENDUNG=i%%
FOR j%% in (E, F, G, H, I, J, K) do
(
set VAR=j%%
dir %VAR%:\
IF errorlevel 1 goto FERTIG
cls
md "%ZIELVERZEICHNIS%\%date%"
FOR /D %%i IN (%VAR%:\) DO (SET ShortFileOrDirName=%%~fsi)
FOR /F %%i IN ('dir /ad /b %ShortFileOrDirName% /S') DO copy %%i\*.%ENDUNG% %ZIELVERZEICHNIS%\%date%
)
)
ab hier dann die ganzen Jump-Points Hinweis, Fertig etc pp.
Wenn ich das so mache, kommt dann beim Programmaufruf in der Eingabeaufforderung bei echo on nach der Abfrage von ZIELVERZEICHNIS sowas wie:
"%i" ist an dieser Stelle syntaktisch nicht verarbeitbar.
Meine Frage zu Punkt 1 ist also:
Wie kann ich das Programm verkürzen und alles in eine bzw zwei for-Schleifen packen, so dass ich bei Bedarf einfach nur in der Klammer der einen Schleife Laufwerksbuchstaben und in der anderen Schleife Dateiendungen hinzufügen/entfernen kann, ohne das an ganz vielen Stellen im Programm zu machen.
Nur als Beispiel: Wenn ich 8 Dateitypen kopieren lassen will, dann muss ich acht Jump-Point Verbände erstellen, also z.b. E1-K1, E2-K2, E3-K3 - E8-K8...
Das macht das Programm RIESIG und Änderungen sehr zeitaufwendig.
Punkt 2:
Ich habe ausserdem das Problem, dass ich bei ZIELVERZEICHNIS keinen Pfad mit Leerzeichen zuweisen darf, z.B. "D:\Eigene Dateien\Bilder" oder so.
Das wird dann nur bis "D:\Eigene" verarbeitet. Ich habe versucht die for-Schleife der einzelnen Kopierbefehle daraufhin umzubauen, dass das ZIELVERZEICHNIS mit Kurz-Namen benutzt wird, aber das hab ich nicht hinbekommen. Etwa so in der Art:
FOR /D %%i IN (%ZIELVERZEICHNIS%) DO (SET ShortFileOrDirName=%%~fsi)
set ZIELKURZ=%%i
und dann ZIELKURZ weiterverwenden oder so
set ZIELKURZ=%%i
und dann ZIELKURZ weiterverwenden oder so
Ich hoffe, irgendwer von euch kann mir da weiterhelfen
MfG
Dark
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 110775
Url: https://administrator.de/contentid/110775
Ausgedruckt am: 22.11.2024 um 00:11 Uhr
19 Kommentare
Neuester Kommentar
Hallo TheDarkLord und willkommen im Forum!
Vorweg zu Deiner Frage 2: Wenn Du %ZIELVERZEICHNIS% konsequent unter Anführungszeichen gesetzt verwendest, sollten enthaltene Leerzeichen kein Problem sein ...
Grundsätzlich würde ich die Reihenfolge der beiden Schleifen verändern: zunächst das/die Laufwerk/e finden, und erst dann die einzelnen Dateitypen berücksichtigen (wobei sich letzteres ohnehin zusammenfassen lässt - siehe unten).
Zum Finden der Laufwerke bietet sich ein wenig eingestreutes VBScript (vom Batch selbst erzeugt) an - die Abfrage des "DriveType" auf den Wert 1 liefert nur Buchstaben von als "austauschbar" gekennzeichneten Laufwerken, und dies auch nur, wenn sich ein Datenträger im Laufwerk befindet (Kartenleser!).
Um zusätzlich nur bestimmte Laufwerksbuchstaben zu berücksichtigen (eher ein Thema, wenn auch der Typ 2 = "feste" Laufwerke - etwa externe, aber natürlich vor allem interne Festplatten - erfasst werden sollte), ist im folgenden Batch eine Liste der zu verwendenden Buchstaben vorgegeben (so ließe sich zB C ausschließen).
Ohne "Benutzeroberfläche" sähe das dann etwa so aus:
[Edit] Da ich das Datumsformat "JJJJ-MM-TT" übersichtlicher (und leichter sortierbar) finde, habe ich die Angabe des Kopierzieles entsprechend angepasst.
Noch als Anmerkung zur Verwendung von "xcopy": Damit wird das Zielverzeichnis %DATUM% nur erstellt, wenn tatsächlich Dateien kopiert werden.
[/Edit]
Grüße
bastla
Vorweg zu Deiner Frage 2: Wenn Du %ZIELVERZEICHNIS% konsequent unter Anführungszeichen gesetzt verwendest, sollten enthaltene Leerzeichen kein Problem sein ...
Grundsätzlich würde ich die Reihenfolge der beiden Schleifen verändern: zunächst das/die Laufwerk/e finden, und erst dann die einzelnen Dateitypen berücksichtigen (wobei sich letzteres ohnehin zusammenfassen lässt - siehe unten).
Zum Finden der Laufwerke bietet sich ein wenig eingestreutes VBScript (vom Batch selbst erzeugt) an - die Abfrage des "DriveType" auf den Wert 1 liefert nur Buchstaben von als "austauschbar" gekennzeichneten Laufwerken, und dies auch nur, wenn sich ein Datenträger im Laufwerk befindet (Kartenleser!).
Um zusätzlich nur bestimmte Laufwerksbuchstaben zu berücksichtigen (eher ein Thema, wenn auch der Typ 2 = "feste" Laufwerke - etwa externe, aber natürlich vor allem interne Festplatten - erfasst werden sollte), ist im folgenden Batch eine Liste der zu verwendenden Buchstaben vorgegeben (so ließe sich zB C ausschließen).
Ohne "Benutzeroberfläche" sähe das dann etwa so aus:
@echo off & setlocal
set "DATEN=*.jpg *.bmp *.3gp"
set "LAUFWERKE=EFGHIJK"
set "ZIELVERZEICHNIS=Z:\SammelErgebnis"
set "DATUM=%date:~-4%-%date:~-7,2%-%date:~-10,2%"
set "GDL=%temp%\GetDriveLetters.vbs"
>%GDL% echo Set fso=CreateObject("Scripting.FileSystemObject"):For Each D In fso.Drives:If D.DriveType=1 Then:If D.IsReady Then:WScript.Echo D.DriveLetter:End If:End If:Next
for /f %%i in ('cscript //nologo %GDL%') do (
echo "%LAUFWERKE%"|findstr /i %%i >nul && (
pushd %%i:\
for /f "delims=" %%a in ('dir /s /b /a-d %DATEN%') do (
echo %%a
xcopy "%%a" "%ZIELVERZEICHNIS%\%DATUM%\">nul
)
popd
)
)
Noch als Anmerkung zur Verwendung von "xcopy": Damit wird das Zielverzeichnis %DATUM% nur erstellt, wenn tatsächlich Dateien kopiert werden.
[/Edit]
Grüße
bastla
Hallo TheDarkLord!
Da derzeit nur "austauschbare" Datenträger erfasst werden, kann es gar nicht sein, dass von der Festplatte C: kopiert wird - mit einem USB-Stick solltest Du aber testen können...
Um zu prüfen, welche Laufwerksbuchstaben verarbeitet werden, kannst Du zwischen Zeile 11 und 12 ein "echo %%i" einfügen.
Falls Du auch Festplatten einbeziehen willst, ersetze die Zeile 9 durch
Grüße
bastla
P.S.: Bitte nutze zum Posten von Batches die -Formatierung ...
Da derzeit nur "austauschbare" Datenträger erfasst werden, kann es gar nicht sein, dass von der Festplatte C: kopiert wird - mit einem USB-Stick solltest Du aber testen können...
Um zu prüfen, welche Laufwerksbuchstaben verarbeitet werden, kannst Du zwischen Zeile 11 und 12 ein "echo %%i" einfügen.
Falls Du auch Festplatten einbeziehen willst, ersetze die Zeile 9 durch
>%GDL% echo Set fso=CreateObject("Scripting.FileSystemObject"):For Each D In fso.Drives:If D.DriveType^<=2 Then:If D.IsReady Then:WScript.Echo D.DriveLetter:End If:End If:Next
bastla
P.S.: Bitte nutze zum Posten von Batches die -Formatierung ...
Hallo TheDarkLord!
Das VBScript hat nur einen Zweck: Es liefert die Buchstaben der derzeit verfügbaren Laufwerke (als %%i in der Schleife) - den ganzen Rest erledigt weiterhin der Batch. Um also bei Vorhandensein einer bestimmten Datei die Verarbeitung zu überspringen, könnte so aussehen:
Die letzte Zeile sollte keiner besonderen Beschreibung bedürfen ...
Grüße
bastla
[Edit] Fehlenden ":" in Zeile 14 hinzugefügt [/Edit]
Das VBScript hat nur einen Zweck: Es liefert die Buchstaben der derzeit verfügbaren Laufwerke (als %%i in der Schleife) - den ganzen Rest erledigt weiterhin der Batch. Um also bei Vorhandensein einer bestimmten Datei die Verarbeitung zu überspringen, könnte so aussehen:
@echo off & setlocal
set "DATEN=*.jpg *.bmp *.3gp"
set "LAUFWERKE=EFGHIJK"
set "ABFRAGE=abfrage.txt"
set "ZIELVERZEICHNIS=Z:\SammelErgebnis"
set "DATUM=%date:~-4%-%date:~-7,2%-%date:~-10,2%"
set "GDL=%temp%\GetDriveLetters.vbs"
>%GDL% echo Set fso=CreateObject("Scripting.FileSystemObject"):For Each D In fso.Drives:If D.DriveType=1 Then:If D.IsReady Then:WScript.Echo D.DriveLetter:End If:End If:Next
for /f %%i in ('cscript //nologo %GDL%') do (
echo "%LAUFWERKE%"|findstr /i %%i >nul && (
dir /a-d "%%i:\%ABFRAGE%">nul 2>&1 || (
pushd %%i:\
for /f "delims=" %%a in ('dir /s /b /a-d %DATEN%') do (
echo %%a
xcopy "%%a" "%ZIELVERZEICHNIS%\%DATUM%\">nul
)
)
popd
)
)
if not exist "%ZIELVERZEICHNIS%\%DATUM%\" echo Es wurden keine Dateien kopiert!
Grüße
bastla
[Edit] Fehlenden ":" in Zeile 14 hinzugefügt [/Edit]
Hallo TheDarkLord!
Ein Hinweis: Deine Endfassung (bzw mein vorheriger Ansatz) berücksichtigt jetzt wieder nur den Laufwerkstyp 1 (also "Wechseldatenträger") ...
Grüße
bastla
In Deinem letzten Script hast Du nen kleinen Fehler gemacht. In Zeile 14 fehlen die Doppelpunkte, es muss heissen "i%%:\%ABFRAGE%"
Leider ja - ich korrigier's oben zur Sicherheit auch noch.Ein Hinweis: Deine Endfassung (bzw mein vorheriger Ansatz) berücksichtigt jetzt wieder nur den Laufwerkstyp 1 (also "Wechseldatenträger") ...
Grüße
bastla
Hallo TheDarkLord!
... ansonsten per weiterer Abfrage zwischen den Zeilen 39 und 40 (schließende Klammer zwischen 49 und 50):
Grüße
bastla
[Edit] In %%i steht weiterhin nur der Laufwerksbuchstabe (ohne ":"), daher nur mit dem ersten Zeichen des Zielverzeichnisses, aber dafür ohne Berücksichtigung von Groß-/Kleinschreibung, vergleichen;
obwohl - damit wird eigentlich ein vollständiger Pfad inkl. Laufwerksbuchstabe für das Zielverzeichnis vorausgesetzt; daher (etwas) besser: zwischen Zeile 25 und 26:
und dann
Und
könnte zur Sicherheit auch noch an passender Stelle (nach der neuen Zeile 26) rein ...
[/Edit]
Wie mach ich das mit den gleichen Laufwerken?
Wird eigentlich auch durch "/dy" abgedeckt - Dateien werden so zwar einmal (auch, wenn's vermutlich nicht beabsichtigt ist), aber dann auch wirklich nur einmal kopiert (wobei aber daraus, bei näherer Betrachtung, ohnehin keine Endlosschleife hätte entstehen sollen) ...... ansonsten per weiterer Abfrage zwischen den Zeilen 39 und 40 (schließende Klammer zwischen 49 und 50):
if /i %%i neq %ZIELVERZEICHNIS:~,1% (
...
)
bastla
[Edit] In %%i steht weiterhin nur der Laufwerksbuchstabe (ohne ":"), daher nur mit dem ersten Zeichen des Zielverzeichnisses, aber dafür ohne Berücksichtigung von Groß-/Kleinschreibung, vergleichen;
obwohl - damit wird eigentlich ein vollständiger Pfad inkl. Laufwerksbuchstabe für das Zielverzeichnis vorausgesetzt; daher (etwas) besser: zwischen Zeile 25 und 26:
for %%i in ("%ZIELVERZEICHNIS%") do set "ZLW=%%~di"
if /i "%%i:" neq "%ZLW%" (
Und
if not defined ZLW goto :Hinweis1
if not exist %ZLW% goto :Hinweis1
[/Edit]
Hallo TheDarkLord!
Etwas zum Testen:
Um den Umgang mit der "config.ini" etwas zu vereinfachen, beginnen alle relevanten Variablen mit "TDL_".
Grüße
bastla
Etwas zum Testen:
@echo off & setlocal
REM Autocopy Script
REM ---------------
REM Es kann verwendet werden, um automatisch bestimmte DateiTDL_TYPen von WechselTDL_DATENträgern
REM wie USB-Sticks oder Speicherkarten von Digi-Cams oder Handys auf HD zu kopieren.
REM Bitte die REM-Zeilen nicht entfernen!
REM
REM (c) TheDarkLord 2009
REM Spezieller Dank an "bastla" von www.administrator.de
:START
if exist "%~dp0\config.ini" for /f "usebackq delims=" %%i in ("%~dp0\config.ini") do set "%%i"
IF "%TDL_ZIELVERZEICHNIS%"=="" goto SETUP
IF "%TDL_DATEN%"=="" goto SETUP
IF "%TDL_LAUFWERKE%"=="" goto SETUP
IF "%TDL_TYP%"=="" goto SETUP
set "ABFRAGE=abfrage"
set "DATUM=%date:~-4%-%date:~-7,2%-%date:~-10,2%"
set "GDL=%temp%\GetDriveLetters.vbs"
>%GDL% echo Set fso=CreateObject("Scripting.FileSystemObject"):For Each D In fso.Drives:If D.DriveTYPE^<=%TDL_TYP% Then:If D.IsReady Then:WScript.Echo D.DriveLetter:End If:End If:Next
:HAUPTPROGRAMM
for /f %%i in ('cscript //nologo %GDL%') do (
echo "%TDL_LAUFWERKE%"|findstr /i %%i >nul && (
dir /a-d "%%i:\%ABFRAGE%">nul 2>&1 || (
pushd %%i:\
for /f "delims=" %%a in ('dir /s /b /a-d %TDL_DATEN% 2^>nul') do (
echo %%a
xcopy /dy "%%a" "%TDL_ZIELVERZEICHNIS%\%DATUM%\">nul
)
)
popd
)
)
dir "%TDL_ZIELVERZEICHNIS%\%DATUM%">nul 2>&1 || goto FEHLER
set ANZAHL=0
for %%i in ("%TDL_ZIELVERZEICHNIS%\%DATUM%\*") do set /a ANZAHL+=1
goto ERFOLG
:SETUP
echo\
echo P R O G R A M M F E H L E R
echo\
echo Setup nicht abgeschlossen!
echo\
echo Bitte ZIELVERZEICHNIS eingeben:
echo (Beispiel: C:\Bilder oder D:\Eigene Dateien\Bilder)
set /p TDL_ZIELVERZEICHNIS=
echo\
echo Bitte Datei_Typen eingeben:
echo (Beispiel: *.jpg oder *.bmp *.avi *.mpg *.3gp)
set /p TDL_DATEN=
echo\
echo Bitte Laufwerksbuchstaben eingeben:
echo (Beispiel: E oder EFGHIJK)
set /p TDL_LAUFWERKE=
:TYPEINGABE
echo\
echo [1] Nur Wechseldatentraeger wie USB und Speicherkarten
echo [2] Wechseldatentraeger und Festplatten (intern und extern)
echo Abbruch
set /P AUSWAHL=Bitte Auswahl treffen [1/2/0]:
if "%AUSWAHL:~,1%"=="0" goto :ABBRUCH
if "%AUSWAHL:~,1%"=="1" goto :TYP1
if "%AUSWAHL:~,1%"=="2" goto :TYP2
goto :TYPEINGABE
:TYP1
set "TDL_TYP=1"
goto SETCONFIG
:TYP2
set "TDL_TYP=2"
:SETCONFIG
set TDL_>"%~dp0\config.ini"
goto START
:ERFOLG
cls
echo\
echo E R F O L G R E I C H
echo\
echo %ANZAHL% Datei(en) nach %TDL_ZIELVERZEICHNIS%\%DATUM% kopiert!
echo\
pause
goto :eof
:FEHLER
cls
echo\
echo F E H L E R
echo\
echo Keine Speicherkarte oder keine Dateien zum Kopieren gefunden!
echo\
pause
goto :eof
:ABBRUCH
cls
echo\
echo F E H L E R
echo\
echo Abbruch durch Benutzer!
echo\
pause
goto :eof
Grüße
bastla