thedarklord
Goto Top

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:

@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


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.

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


Ich hoffe, irgendwer von euch kann mir da weiterhelfen face-smile

MfG
Dark

Content-Key: 110775

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

Printed on: April 18, 2024 at 00:04 o'clock

Member: bastla
bastla Mar 07, 2009 at 14:49:52 (UTC)
Goto Top
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:
@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
    )
)
[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
Member: TheDarkLord
TheDarkLord Mar 07, 2009 at 16:38:48 (UTC)
Goto Top
Hallo,

vielen Dank für die Begrüßung und auf jeden Fall auch für die super schnelle Antwort face-smile
Ich werd das gleich mal prüfen ^^

MfG
Dark
Member: TheDarkLord
TheDarkLord Mar 07, 2009 at 17:07:22 (UTC)
Goto Top
Hey, habs getestet, aber es funktioniert nicht so richtig...
Habe eine "Benutzeroberfläche" eingebaut. Testweise habe ich jetzt C mit in die Laufwerke genommen und als Dateiendung *.bmp ausgewählt. Aber trotz das da logischerweise bmps vorhanden sind, wird nichts kopiert... könntest Du vielleicht nochmal drüber schauen, warum nicht? So siehts jetzt aus:

@echo on & setlocal

set "ZIELVERZEICHNIS=D:\Download"
set "DATEN=*.bmp"
set "LAUFWERKE=CEFGHIJK"

IF "%ZIELVERZEICHNIS%"=="" goto HINWEIS1
IF "%DATEN%"=="" goto HINWEIS2
IF "%LAUFWERKE%"=="" goto HINWEIS3

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
)
)

dir %ZIELVERZEICHNIS%\%DATUM%
IF errorlevel 1 goto FEHLER

set ANZAHL=0
for %%i in (%ZIELVERZEICHNIS%\%date%\*) do set /a ANZAHL+=1
goto ERFOLG

:ERFOLG
REM cls
echo.
echo E R F O L G R E I C H
echo.
echo %ANZAHL% Datei(en) nach %ZIELVERZEICHNIS%\%DATUM% kopiert!
echo.
pause
exit

:FEHLER
REM cls
echo.
echo F E H L E R
echo.
echo Keine Speicherkarte oder keine Dateien zum kopieren gefunden!
echo.
pause
exit

:HINWEIS1
echo.
echo P R O G R A M M F E H L E R
echo.
echo Kein Zielverzeichnis festgelegt!
echo.
pause
exit

:HINWEIS2
echo.
echo P R O G R A M M F E H L E R
echo.
echo Keine Dateitypen festgelegt!
echo.
pause
exit

:HINWEIS3
echo.
echo P R O G R A M M F E H L E R
echo.
echo Keine Laufwerke festgelegt!
echo.
pause
exit
Member: bastla
bastla Mar 07, 2009 at 17:13:13 (UTC)
Goto Top
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
>%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 
Grüße
bastla

P.S.: Bitte nutze zum Posten von Batches die -Formatierung ...
Member: TheDarkLord
TheDarkLord Mar 08, 2009 at 01:10:33 (UTC)
Goto Top
Aah SUPER, vielen Dank bastla, funktioniert klasse!
In meinem alles-nacheinander-Script hatte ich noch die Möglichkeit gehabt, auf den Laufwerken das Vorhanden sein einer Datei zu überprüfen, z.b. die Datei "abfrage" um automatisch einen bestimmten USB-Stick auszuschliessen, der auch angesteckt ist.
Das hatte ich gelöst mit:
dir %LAUFWERKE%:\abfrage
if errorlevel=1
hier die copy-Geschichte
Also wenn die Datei nicht vorhanden ist, macht er den copy-Krams, ansonsten springt er halt zum nächsten Laufwerk. Nur hab ich bei dem VB-Script jetzt KEINE Ahnung, wie bzw wo ich das jetzt noch einbauen kann face-smile
Wenn DAS auch noch funktioniert, dann läuft mein Script perfekt und genauso, wie ich es haben wollte. Ausser vielleicht, dass es die Ausgabe: "Keine Dateien zum kopieren vorhanden" nicht mehr gibt, weil ja gar kein Ordner erstellt wird, wenn nichts zum kopieren da ist. Ich hatte ja einfach geprüft, ob in dem Ordner was drin ist und wenn er leer war den Satz ausgegeben und den Ordner wieder gelöscht... Aber auch das weiss ich nun mit dem VB nicht mehr zu realisieren face-confused

MfG
Dark
Member: bastla
bastla Mar 08, 2009 at 09:58:48 (UTC)
Goto Top
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:
@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!  
Die letzte Zeile sollte keiner besonderen Beschreibung bedürfen ... face-wink

Grüße
bastla

[Edit] Fehlenden ":" in Zeile 14 hinzugefügt [/Edit]
Member: TheDarkLord
TheDarkLord Mar 08, 2009 at 13:05:06 (UTC)
Goto Top
Ah super, jetzt funktioniert alles, vielen Dank face-smile
In Deinem letzten Script hast Du nen kleinen Fehler gemacht. In Zeile 14 fehlen die Doppelpunkte, es muss heissen "i%%:\%ABFRAGE%" face-smile
Deshalb poste ich es hier nochmal komplett und auch mit "Benutzeroberfläche", falls es jemand benutzen will:

@echo off & setlocal 


REM Autocopy Script
REM ---------------
REM Es kann verwendet werden, um automatisch bestimmte Dateitypen von Wechseldatenträ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  



set "ZIELVERZEICHNIS="  
REM Syntax "=C:\Bilder" oder "=D:\Eigene Dateien\Bilder" etc  

set "DATEN="   
REM Syntax "=*.jpg" oder "=*.bmp *.avi *.mpg *.3gp" etc  

set "LAUFWERKE="   
REM Syntax "=E" oder "=EFGHIJK"  


IF "%ZIELVERZEICHNIS%"=="" goto HINWEIS1  
IF "%DATEN%"=="" goto HINWEIS2  
IF "%LAUFWERKE%"=="" goto HINWEIS3  
set "ABFRAGE=abfrage"  

set "DATUM=%date:~-4%-%date:~-7,2%-%date:~-10,2%"   
set "GDL=%temp%\GetDriveLetters.vbs"  

REM Nur Wechseldatenträger wie USB und Flash, keine Festplatten: 
>%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  

REM Wechseldatenträger und Festplatten (intern und extern):
REM >%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   

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 /dy "%%a" "%ZIELVERZEICHNIS%\%DATUM%\">nul  
            )
        )
        popd
    )
)

dir "%ZIELVERZEICHNIS%\%DATUM%"  
IF errorlevel 1 goto FEHLER
cls

set ANZAHL=0
for %%i in ("%ZIELVERZEICHNIS%\%DATUM%\*") do set /a ANZAHL+=1  
goto ERFOLG

:ERFOLG
cls
echo\
echo E R F O L G R E I C H
echo\
echo %ANZAHL% Datei(en) nach %ZIELVERZEICHNIS%\%DATUM% kopiert!
echo\
pause
exit

:FEHLER
cls
echo\
echo F E H L E R
echo\
echo Keine Speicherkarte oder keine Dateien zum kopieren gefunden!
echo\
pause
exit

:HINWEIS1
echo\
echo P R O G R A M M F E H L E R
echo\
echo Kein Zielverzeichnis festgelegt!
echo\
echo Zum bearbeiten:
pause
notepad Autocopy.bat
exit

:HINWEIS2
echo\
echo P R O G R A M M F E H L E R
echo\
echo Keine Dateitypen festgelegt!
echo\
echo Zum bearbeiten:
pause
notepad Autocopy.bat
exit

:HINWEIS3
echo\
echo P R O G R A M M F E H L E R
echo\
echo Keine Laufwerke festgelegt!
echo\
echo Zum bearbeiten:
pause
notepad Autocopy.bat
exit

Hier nochmal als direkten Download, aber nicht vergessen die BAT zu bearbeiten und die Variablen am Anfang festzulegen!
http://daten.dl-host.de/progs/autocopy.zip
Member: bastla
bastla Mar 08, 2009 at 13:45:24 (UTC)
Goto Top
Hallo TheDarkLord!

In Deinem letzten Script hast Du nen kleinen Fehler gemacht. In Zeile 14 fehlen die Doppelpunkte, es muss heissen "i%%:\%ABFRAGE%" face-smile
Leider ja face-sad - 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
Member: TheDarkLord
TheDarkLord Mar 08, 2009 at 13:56:52 (UTC)
Goto Top
Ja das weiss ich... ich füg die Zeile für Festplatten noch geREMt hinzu, danke für den Hinweis ^^
Member: TheDarkLord
TheDarkLord Mar 08, 2009 at 17:25:27 (UTC)
Goto Top
Ich hab noch einen kleinen Bug gefixt, der die Batch unter gewissen umständen hat aufhängen lassen, aber jetzt funktioniert es einwandfrei face-smile

Nochmals vielen Dank, bastla
Member: bastla
bastla Mar 08, 2009 at 17:33:04 (UTC)
Goto Top
Hallo TheDarkLord!
Ich hab noch einen kleinen Bug gefixt, der die Batch unter gewissen umständen hat aufhängen lassen
Ich nehme an, Du meinst damit die Vorsorge für den Fall, dass Quell- und Ziellaufwerk beim Kopieren (wegen einer fehlerhaften Laufwerksliste) gleich sind ...

Grüße
bastla
Member: TheDarkLord
TheDarkLord Mar 08, 2009 at 17:46:04 (UTC)
Goto Top
Hmm nein, das ist mir noch garnicht aufgefallen, da muss ich nochmal nachschauen...
Das muss doch bestimmt im VB Script gemacht werden oder? Wie geht das dann?
Ich meinte den Bug, dass sich das Script aufhängt, wenn eine Datei schon im Ziel-Ordner vorhanden ist, weil z.B. das Programm nochmal ausgeführt wird, weil jemand noch ein paar neue Fotos gemacht hat und die am selben Tag auch noch kopieren möchte.
Ich hab bei xcopy noch die Option /dy hinzugefügt, dass in diesem Fall dann nur neue Dateien kopiert und automatisch überschrieben werden.
Wie mach ich das mit den gleichen Laufwerken?
Member: bastla
bastla Mar 08, 2009 at 17:56:12 (UTC)
Goto Top
Hallo TheDarkLord!
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% (
...
)
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:
for %%i in ("%ZIELVERZEICHNIS%") do set "ZLW=%%~di"
und dann
if /i "%%i:" neq "%ZLW%" (

Und
if not defined ZLW goto :Hinweis1
if not exist %ZLW% goto :Hinweis1
könnte zur Sicherheit auch noch an passender Stelle (nach der neuen Zeile 26) rein ...
[/Edit]
Member: TheDarkLord
TheDarkLord Mar 08, 2009 at 18:01:45 (UTC)
Goto Top
Hallo bastla!

Ja dann lass ich es so wie es jetzt ist. FALLS es irgendwann doch mal auftreten sollte, kann ich ja nochmal die if-Schleife dazwischen hängen face-smile

Gruß
Dark
Member: TheDarkLord
TheDarkLord Mar 09, 2009 at 17:09:09 (UTC)
Goto Top
Hallo nochmal face-smile

Ich hab das Prog noch ein wenig erweitert mit externer config.ini welche beim ersten mal gesetzt wird. Funktioniert auch alles einwandfrei etc pp.
Mir ist aber aufgefallen, dass Deine Zeile für Laufwerkstypen 2 irgendwie nicht funktioniert...
Das ist die Zeile von Dir:
>%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  
Wenn ich das Script aber damit laufen lasse, kopiert der keine Dateien von C oder von ner CD...
Hier nochmal mein aktuelles Script, vielleicht hab ich ja irgendwo anders nen Fehler, weshalb es nicht geht, von C oder CD-ROM zu kopieren:
@echo off & setlocal 


REM Autocopy Script
REM ---------------
REM Es kann verwendet werden, um automatisch bestimmte Dateitypen von Wechseldatenträ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
for /f "delims== tokens=1,2" %%i in ('findstr "ZIELVERZEICHNIS" config.ini') do @set ZIELVERZEICHNIS=%%j  
cls
for /f "delims== tokens=1,2" %%i in ('findstr "DATEN" config.ini') do @set DATEN=%%j  
cls
for /f "delims== tokens=1,2" %%i in ('findstr "LAUFWERKE" config.ini') do @set LAUFWERKE=%%j  
cls
for /f "delims== tokens=1,2" %%i in ('findstr "TYP" config.ini') do @set TYP=%%j  
cls

IF "%ZIELVERZEICHNIS%"=="" goto SETUP  
IF "%DATEN%"=="" goto SETUP  
IF "%LAUFWERKE%"=="" goto SETUP  
IF "%TYP%"=="" goto SETUP  

set "ABFRAGE=abfrage"  
set "DATUM=%date:~-4%-%date:~-7,2%-%date:~-10,2%"   
set "GDL=%temp%\GetDriveLetters.vbs"  

IF /I "%TYP:~0,-1%"=="2" goto :RUN2   

:RUN1
>%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  
goto HAUPTPROGRAMM

:RUN2
>%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  

:HAUPTPROGRAMM
for /f %%i in ('cscript //nologo %GDL%') do (  
    echo "%LAUFWERKE:~0,-1%"|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:~0,-1%') do (  
                echo %%a
                xcopy /dy "%%a" "%ZIELVERZEICHNIS:~0,-1%\%DATUM%\">nul  
            )
        )
        popd
    )
)

dir "%ZIELVERZEICHNIS:~0,-1%\%DATUM%"  
IF errorlevel 1 goto FEHLER
cls

set ANZAHL=0
for %%i in ("%ZIELVERZEICHNIS:~0,-1%\%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 TEMPZIELVERZEICHNIS=
echo\
echo Bitte Dateitypen eingeben:
echo (Beispiel: "*.jpg" oder "*.bmp *.avi *.mpg *.3gp")  
set /p TEMPDATEN=
echo\
echo Bitte Laufwerksbuchstaben eingeben:
echo (Beispiel: "E" oder "EFGHIJK")  
set /p TEMPLAUFWERKE=
echo\
echo [1] Nur Wechseldatentraeger wie USB und Speicherkarten
echo [2] Wechseldatentraeger und Festplatten (intern und extern)
set /P AUSWAHL=Bitte Auswahl treffen [1/2]:
IF /I "%AUSWAHL%"=="1" goto :TYP1  
IF /I "%AUSWAHL%"=="2" goto :TYP2   

:TYP1
set "TEMPTYP=1"  
goto SETCONFIG

:TYP2
set "TEMPTYP=2"  

:SETCONFIG
echo ZIELVERZEICHNIS=%TEMPZIELVERZEICHNIS% > config.ini
echo DATEN=%TEMPDATEN% >> config.ini
echo LAUFWERKE=%TEMPLAUFWERKE% >> config.ini
echo TYP=%TEMPTYP% >> 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 %ZIELVERZEICHNIS:~0,-1%\%DATUM% kopiert!
echo\
pause
exit

:FEHLER
cls
echo\
echo F E H L E R
echo\
echo Keine Speicherkarte oder keine Dateien zum kopieren gefunden!
echo\
pause
exit
Member: bastla
bastla Mar 09, 2009 at 17:18:05 (UTC)
Goto Top
Hallo TheDarkLord!

Da in der "erweiterten" Scriptvariante für Typ 1 und 2 vorgesorgt werden soll, ist die Abfrage "<=2" - damit das "<" auch im Script ankommt, muss es "maskiert" werden, daher:
... ^<=2 ...
(hatte ich eigentlich auch so gepostet) ...
CD-ROM-Laufwerke haben Typ 4.

Grüße
bastla
Member: TheDarkLord
TheDarkLord Mar 09, 2009 at 17:25:11 (UTC)
Goto Top
Hallo bastla!

Ja das hab ich auch so gehabt mit dem "^", das ist nur irgendwie beim kopieren hier untergegangen. Habe es hier aktualisiert. Aber dennoch kopiert der nichts von C oder D...
Wenn ich ^<=4 mache, überprüft der also neben Festplatten (was ja irgendwie nicht geht gerade), USB und Speicherkarten auch CD-Roms?
Das werde ich mal testen, danke face-smile

EDIT:
Hm nein, kopiert nichts von CD... nochmal von USB testen, obs überhaupt noch geht face-confused
Member: TheDarkLord
TheDarkLord Mar 09, 2009 at 17:30:39 (UTC)
Goto Top
Verdammt... es geht überhaupt nicht mehr *grmbl*
Jetzt geht die Fehlersuche wieder von vorne los xDD

EDIT: Fehler gefunden, es läuft und kopiert nun alles face-smile

Tut mir leid für die Panikmache, ich hatte meine config manuell bearbeitet und dummerweise das leerzeichen hinter dem letzten dateityp weggelassen.
Dieses wird aber für das script gebraucht und deshalb hat er auch nichts gemacht ^^
Aber trotzdem nochmal vielen Dank für die super Hilfe und immer recht zeitnahen antworten, ich hab Dich im Script natürlich mit aufgeführt!

Gruß
Dark
Member: bastla
bastla Mar 09, 2009 at 19:03:32 (UTC)
Goto Top
Hallo TheDarkLord!

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
Um den Umgang mit der "config.ini" etwas zu vereinfachen, beginnen alle relevanten Variablen mit "TDL_".

Grüße
bastla