scriptingdau
Goto Top

Kopieren von Dateien und Zuordnung dieser mittels erster vier Stellen des Dateinamens

Hallo zusammen,

bislang war ich immer stiller Mitleser, konnte jedoch zu meinem aktuellen Problem keine Lösung finden und wende mich deswegen einmal an euch.

Die Ausgangssituation ist folgende:

Wir haben Filmdaten (.mpg) auf externen HDDs, diese haben Dateinamen bestehend aus Zahlen und Buchstaben.
Beispiel: 0123abc1234.mpg
Anhand der ersten 4 Stellen des Dateinamens soll die Datei in einen Ordner kopiert werden, welcher als Ordnernamen die ersten 4 Stellen des Dateinamens trägt.
0123abc1234.mpg soll also in den Ordner 0123 kopiert werden.

Leider bin ich nicht besonders Scriptbewandert, und würde mich freuen wenn mir jemand helfen kann.

Hier habe ich schon nachgesehen, leider ist es mir nicht möglich gewesen, dass Script für meine Bedürfnisse abzuändern:
Mit welchem Batchbefehl kann ich zwischen Dateien unterscheiden deren Dateinamen mit Buchstaben und Zahlen anfangen?

Kurzzusammenfassung:
Filmdateien mit eindeutigen Dateinamen, anhand der ersten vier Stellen des Namens soll in einen entsprechenden Ordner verschoben werden.


Vielen vielen Dank vorab.

Edit: Dateien sollen kopiert werden, nicht verschoben (gemoved) wie ich vorher geschrieben hatte.

Content-ID: 259010

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

Ausgedruckt am: 26.11.2024 um 22:11 Uhr

Doskias
Doskias 06.01.2015 um 15:36:11 Uhr
Goto Top
Hi ScriptingDau (toller Name :D)

Zuerst einmal bitte konkretisieren. In der Überschrift schreibst du "kopieren" etwas später "gemoved".

Anhand von Powershell der Unterschied:
copy-item: kopieren
move-item: verschieben

Was soll denn nun passieren. Kopieren oder verschieben?

Gruß
Doskias
ScriptingDAU
ScriptingDAU 06.01.2015 um 15:40:39 Uhr
Goto Top
Hey Doskias,

ja der Name war irgendwie passend :D

Es soll kopiert werden, wenn die Datei existiert soll die existierende Datei zusätzlich in einen Ordner namens "Historisch" verschoben werden.
Wollte die Frage so kurz halten wie nur möglich, das verschieben bekomme ich evtl. selber hin. Wichtiger ist mir die Abfrage nach dem Dateinamen um daraufhin die Datei dem richtigen Ordner zuzuweisen.

Ich editiere oben mal.
Vancouverona
Vancouverona 06.01.2015 aktualisiert um 16:37:16 Uhr
Goto Top
SetLocal EnableDelayedExpansion
For %%a in (*.mpg) DO (
Set MPGName=%%~na
copy "%%a" "%MPGName:~0,4%\%%~nxa"
)

Sollte Dir genug Input geben, um Dein Problem lösen zu können.

Lies dir dazu mal
Help For
Help Set und
Help If
ScriptingDAU
ScriptingDAU 06.01.2015 aktualisiert um 16:43:42 Uhr
Goto Top
Habe im Netz folgendes gefunden und schon ein wenig editiert, ich suche hier nach Dateien die mit 1234 beginnen... aber leider wird immer nur die erste Datei kopiert.
@echo off

cls

set SRC=c:\Test
set DEST=c:\ziel

for /f "tokens=4" %%i in ('dir %SRC% ^| find "1111" ') do (


echo copy %SRC%\%%i %DEST%\%%i

copy %SRC%\%%i %DEST%\ >nul

if %errorlevel% EQU 0 (
echo Datei %%i erfolgreich kopiert
) else (
echo FEHLER beim Verarbeiten der Datei %%i
)
)
)
pause
Vancouverona
Vancouverona 06.01.2015 um 16:42:59 Uhr
Goto Top
Packe deine Lösung mal in eine

Setlocal EnableDelayedExpansion

EndLocal

"Klammer"

und benutze für die innere Schleife ! an Stelle von %


Oder bastle mal mit meiner Lösung weiter.
Doskias
Lösung Doskias 06.01.2015, aktualisiert am 20.01.2015 um 11:23:38 Uhr
Goto Top
Versuchs mal mit Powershell:

copy-item -path "Pfad\123*" -destination "zielpfad\" -force -recurse

Hat zumidnest in meinem Test alle Dateien die mit 123 begonnen haben und im Ursprungspfad lagen in den Zielpfad kopiert.

oder als move:

move-item -path "Pfad\123*" -destination "zielpfad\" -force
ScriptingDAU
ScriptingDAU 06.01.2015 um 17:03:36 Uhr
Goto Top
Sieht aktuell so aus:

@echo off
SetLocal EnableDelayedExpansion

set SRC=c:\Test
set DEST=c:\ziel
For %%a in (%SRC%\*.mpg) DO (
echo %%a
Set MPGName=%%~na
echo "%%a" "%MPGName:~0,4%\%~nxa"
)
EndLocal

pause

Bricht aber offensichtlich bei der For-Schleife direkt ab face-sad

Ich glaube ich bin auf dem richtigen Weg, aber ganz richtig ist es noch nicht.
114757
114757 06.01.2015 aktualisiert um 17:29:04 Uhr
Goto Top
Moin,
hatten wir genau hier:
Viele Dateien automatisch in bestehende Ordner ablegen

für dein Beispiel angepasst:
@echo off & setlocal enabledelayedexpansion
set "quelle=C:\temp\quelle"  
set "ziel=C:\temp\ziel"  
for /f "delims=" %%a in ('dir /B /A-D "%quelle%\*.mpg" 2^>nul') DO @(  
    set "name=%%~na"  
    set "folder=!name:~0,4!"  
    if not exist "%ziel%\!folder!\" md "%ziel%\!folder!"  
    copy "%quelle%\%%a" "%ziel%\!folder!\"  
)
Gruß jodel32
ScriptingDAU
ScriptingDAU 06.01.2015 um 17:11:13 Uhr
Goto Top
Zitat von @Doskias:

Versuchs mal mit Powershell:

> copy-item -path "Pfad\123*" -destination "zielpfad\" -force -recurse

Hat zumidnest in meinem Test alle Dateien die mit 123 begonnen haben und im Ursprungspfad lagen in den Zielpfad kopiert.

oder als move:

> move-item -path "Pfad\123*" -destination "zielpfad\" -force

Funktioniert tadellos, DANKE!

Habe ich die Möglichkeit jetzt doch noch, wie in meinem ersten Kommentar geschrieben, wenn eine Datei im Zielordner vorhanden ist, diese dann vorab in den Ordner "Historisch" zu verschieben?


Ihr seid die besten, krass wie ihr alle mithelft. DANKE!
ScriptingDAU
ScriptingDAU 06.01.2015 aktualisiert um 17:19:23 Uhr
Goto Top
Zitat von @114757:

Moin,
hatten wir genau hier:
Viele Dateien automatisch in bestehende Ordner ablegen

für dein Beispiel angepasst:
> @echo off & setlocal enabledelayedexpansion
> set "quelle=C:\Quelle"  
> set "ziel=D:\Ziel"  
> for /f "delims=" %%a in ('dir /B /A-D "%quelle%\*.mpg" 2^>nul') DO @(  
>     set "name=%%~na"  
>     set folder=!name:~0,4!
>     if not exist "%ziel%\!folder!\" md "%ziel%\!folder!"  
>     copy "%quelle%\%%a" "%ziel%\!folder!\"  


> )
> 
Gruß jodel32



Habe nur den Pfad mal für mich angepasst, auf C:\Test und C:\Ziel, allerdings bricht er in der For-Schleife wieder ab.. magst du nochmal drübersehen?
Danke!
114757
Lösung 114757 06.01.2015 aktualisiert um 18:12:44 Uhr
Goto Top
Zitat von @ScriptingDAU:
Habe nur den Pfad mal für mich angepasst, auf C:\Test und C:\Ziel, allerdings bricht er in der For-Schleife wieder ab.. magst
du nochmal drübersehen?
Geht einwandfrei, du musst es falsch kopiert haben !!
114757
Lösung 114757 06.01.2015 aktualisiert um 18:12:38 Uhr
Goto Top
übrigens macht folgendes Powershell-Script das alles ebenfalls automatisch:
$quelle = "C:\quelle"  
$ziel = "C:\\ziel"  
gci "$quelle\*.mpg" -recurse | %{  
    $targetfolder = "$ziel\$($_.BaseName.SubString(0,4))"   
    if(!(Test-Path $targetfolder)){md $targetfolder -Force | out-null}
    copy-item $_.FullName -Destination $targetfolder -Force
}
ScriptingDAU
ScriptingDAU 06.01.2015 um 18:12:35 Uhr
Goto Top
Mein Fehler, nun klappt es.

Ich bedanke mich!
ScriptingDAU
ScriptingDAU 20.01.2015 um 11:17:07 Uhr
Goto Top
Hallo Leute,

ich muss das Thema nochmal aufgreifen.

Das Script funktioniert soweit tadellos, allerdings ist es mir nicht möglich das Script um folgenden Punkt zu erweitern:

Wenn der Film bereits in dem Ordner existiert, soll er in den Unterordner "Historisch" verschoben werden und an den Dateinamen das Datum + Stunde angehangen werden.
Kann mir irgendwer helfen? Ich verzweifle mal wieder. face-sad

Hier das Ausgangsscript:

@echo off & setlocal enabledelayedexpansion

rem Zuerst die Quelle angeben z.B. externe Festplatte
set "quelle=C:\Quelle"

rem Hier das Ziel angeben, allerdings nur den Unterordner
set "ziel=C:\Ziel"

for /f "delims=" %%a in ('dir /B /A-D "%quelle%\*.mpg" 2^>nul') DO @(
set "name=%%~na"
set folder=!name:~0,4!
if not exist "%ziel%\!folder!\" md "%ziel%\!folder!"
copy "%quelle%\%%a" "%ziel%\!folder!\"
)

pause
114757
Lösung 114757 20.01.2015 aktualisiert um 19:01:21 Uhr
Goto Top
@echo off & setlocal enabledelayedexpansion
set "quelle=C:\quelle"  
set "ziel=C:\ziel"  
for /f "delims=" %%a in ('dir /B /A-D "%quelle%\*.mpg" 2^>nul') DO @(  
    set "name=%%~na"  
    set "folder=!name:~0,4!"  
    if not exist "%ziel%\!folder!\" md "%ziel%\!folder!"  
    if exist "%ziel%\!Folder!\%%~nxa" (  
       if not exist "%ziel%\!folder!\Historisch" md "%ziel%\!folder!\Historisch"  
       move "%ziel%\!Folder!\%%~nxa" "%ziel%\!folder!\Historie\!name!_%date%_%time:~0,2%%%~xa"  
    ) 
    copy "%quelle%\%%a" "%ziel%\!folder!\"  
)
ScriptingDAU
ScriptingDAU 20.01.2015 um 13:59:52 Uhr
Goto Top
Sieht schon extreeem gut aus, hab es mit meinem Script-Spatzenhirn auch nachvollziehen können, allerdings muss das Verzeichnis "Historisch" automatisch ein Unterordner werden.

Beispiel:

In Ordner 9336 liegt die Datei 9336abc und es kommt nun eine neuere Datei 9336abc die kopiert werden soll.
Dann soll die im Ordner 9336 ein Ordner "Historisch" gemacht werden in welche die alte Datei verschoben wird, damit die neuere in 9336 kopiert werden kann.

Also muss da irgendwas mit md hin, aber es will nicht voreinander passen bei mir..

Hilfeeee.
114757
Lösung 114757 20.01.2015 aktualisiert um 22:55:44 Uhr
Goto Top
Na wenns weiter nix is, oben ergänzt
p.s....arbeite mal an deinem IQ face-wink jetzt hab ich schon so viele Vorlagen geliefert, damit hätte das eigentlich auch ein DAU schaffen sollen.
ScriptingDAU
ScriptingDAU 20.01.2015 um 22:57:06 Uhr
Goto Top
Du kannst mir gerne Nachhilfe in Sachen IQ geben :P
Ich versuchs immer nachzuvollziehen, aber die ganzen Parameter und Co überfordern mich immens.

Nochmals vielen Dank!