Bild- und Videodateien per Batch nach Namen und Attributen ins richtige Verzeichnis verschieben oder löschen
Hallo an alle,
ich habe folgende Aufgabe zu lösen:
Es gibt ein Quellverzeichnis "D:\Ablage" wo zahlreiche Bild- & Videodateien mit dem Format: '2018-05-25 13.38.36.*' (*=jpg o. avi o. mpg usw.) abgelegt sind.
Weiterhin gibt es ein Zielverzeichnis "Z:\Foto" mit folgender Verzeichnisstruktur
• 2018
• 01
• 02
• 03
• 04
usw. bis 12
• 2019
• 01
• 02
• 03
• 04
usw. bis 12
also für jedes Jahr.
Nun möchte ich die Dateien aus der Quelle passen zum beginnenden Dateiname "z.B. 2018-05" in das jeweils richtige Monatsverzeichnis des dazugehörigen Jahres VERSCHIEBEN !
Dabei soll geprüft werden, ob die Datei ev. schon vorhanden ist. Ist am Ziel bereits eine passende Datei vorhanden, soll diese, wenn Sie kleiner ist als die Quelldatei, überschrieben werden.
Ist sie gleich oder größer als die Quelldatei soll die Quelldatei nicht verschoben werden, sondern in der Quelle gelöscht werden.
Ziel ist es also das Quellverzeichnis zu leeren und die Quelldateien auf die jeweiligen Jahresverzeichnisse des Zieles, monatsconform, zu verteilen.
Dabei sollen aber nur bereits kleinere vorhandene Dateien überschrieben werden. Ev. größere vorhandene Dateien sollen bestehen bleiben.
Ein Highlight wäre natürlich, wenn der Batch prüft ob es im Zielverzeichnis bereits das passende Jahresverzeichnis und darin das passende Monatsunterverzeichnis vorhanden ist und wenn nicht, es einfach anlegt
das muss aber nicht sein 
Ich hoffe ich habe mein Vorhaben bestmöglich verdeutlicht und wäre für Hilfen sehr dankbar !!!
Grüße und Dank Tom
ich habe folgende Aufgabe zu lösen:
Es gibt ein Quellverzeichnis "D:\Ablage" wo zahlreiche Bild- & Videodateien mit dem Format: '2018-05-25 13.38.36.*' (*=jpg o. avi o. mpg usw.) abgelegt sind.
Weiterhin gibt es ein Zielverzeichnis "Z:\Foto" mit folgender Verzeichnisstruktur
• 2018
• 01
• 02
• 03
• 04
usw. bis 12
• 2019
• 01
• 02
• 03
• 04
usw. bis 12
also für jedes Jahr.
Nun möchte ich die Dateien aus der Quelle passen zum beginnenden Dateiname "z.B. 2018-05" in das jeweils richtige Monatsverzeichnis des dazugehörigen Jahres VERSCHIEBEN !
Dabei soll geprüft werden, ob die Datei ev. schon vorhanden ist. Ist am Ziel bereits eine passende Datei vorhanden, soll diese, wenn Sie kleiner ist als die Quelldatei, überschrieben werden.
Ist sie gleich oder größer als die Quelldatei soll die Quelldatei nicht verschoben werden, sondern in der Quelle gelöscht werden.
Ziel ist es also das Quellverzeichnis zu leeren und die Quelldateien auf die jeweiligen Jahresverzeichnisse des Zieles, monatsconform, zu verteilen.
Dabei sollen aber nur bereits kleinere vorhandene Dateien überschrieben werden. Ev. größere vorhandene Dateien sollen bestehen bleiben.
Ein Highlight wäre natürlich, wenn der Batch prüft ob es im Zielverzeichnis bereits das passende Jahresverzeichnis und darin das passende Monatsunterverzeichnis vorhanden ist und wenn nicht, es einfach anlegt
Ich hoffe ich habe mein Vorhaben bestmöglich verdeutlicht und wäre für Hilfen sehr dankbar !!!
Grüße und Dank Tom
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 561993
Url: https://administrator.de/forum/bild-und-videodateien-per-batch-nach-namen-und-attributen-ins-richtige-verzeichnis-verschieben-oder-loeschen-561993.html
Ausgedruckt am: 03.04.2025 um 17:04 Uhr
14 Kommentare
Neuester Kommentar

Würde ich zwar gleich mit nem Powershell Einzeiler abfackeln aber wenn du es unbedingt kryptisch magst 
@echo off &setlocal
set "quelle=D:\Ablage"
set "ziel=Z:\Foto"
for %%a in ("%quelle%\*.*") do (
for /f "tokens=1,2 delims=-" %%b in ("%%~na") do (
if not exist "%ziel%\%%~b\%%~c" md "%ziel%\%%~b\%%~c" >nul
if not exist "%ziel%\%%~b\%%~c\%%~nxa" move "%%a" "%ziel%\%%~b\%%~c"
)
)

dass die Größenprüfung nicht funktioniert oder nicht vorhanden ist.
Hat je keiner gefordert .... s. Code oben.
wie würde denn der Powershell Einzeiler aussehen ??? LG Tom
gci "d:\Ablage" -File | group {[regex]::match($_.Basename,'\d{4}-\d{2}').Value} | %{$ziel = "Z:\Ziel\$($_.Name.replace('-','\')"; md $ziel -EA SilentlyContinue | out-null; $_.Group | move-item -Destination $ziel -EA SilentlyContinue }
edit - Für die Größenunterscheidung dann
gci "d:\Ablage" -File | ?{$_.Basename -match '\d{4}-\d{2}'} | %{
$ziel = "Z:\Foto\$($matches.replace('-','\'))"
if (!(Test-Path $ziel)){md $ziel -Force | out-null}
$dfile = "$ziel\$($_.Name)"
if (((get-item $dfile -EA SilentlyContinue).Length -gt $_.Length) -or !(Test-Path $dfile)){
$_ | move-item -Destination $ziel -Force
}
}
Moin,
Gruß Thomas
Zitat von @tomreis:
Haben wir aber schon im Ziel die passende Verzeichnisstruktur und im Monat 05 z.B. schon zwei Dateien (eine gross eine klein) werden die beiden gleichnamigen Dateien im Quellverzeichniss werder kopiert, verschoben oder gelöscht. Das Script läuft aber ohne Fehlermeldung - alles bleibt wie es ist ???
einfach noch eine Else-Anweisung anhängen.Haben wir aber schon im Ziel die passende Verzeichnisstruktur und im Monat 05 z.B. schon zwei Dateien (eine gross eine klein) werden die beiden gleichnamigen Dateien im Quellverzeichniss werder kopiert, verschoben oder gelöscht. Das Script läuft aber ohne Fehlermeldung - alles bleibt wie es ist ???
gci "d:\Quellestart" -File | ?{$_.Basename -match '\d{4}-\d{2}'} | %{
$ziel = "d:\Quelleziel\$($matches.replace('-','\'))"
if (!(Test-Path $ziel)){md $ziel -Force | out-null}
$dfile = "$ziel\$($_.Name)"
if (((get-item $dfile -EA SilentlyContinue).Length -gt $_.Length) -or !(Test-Path $dfile)){
$_ | move-item -Destination $ziel -Force
} else {rm $_}
}
Gruß Thomas
Zitat von @tomreis:
Starte ich es z.B. von c:\ dann kommt eine Fehlermeldung, dass das Script die betreffende Bilddatei nicht auf c:\ finden konnte.
In dem Fall muss die Else-Anweisung dannStarte ich es z.B. von c:\ dann kommt eine Fehlermeldung, dass das Script die betreffende Bilddatei nicht auf c:\ finden konnte.
else {rm $_.FullName}
Denn sofern schon am Ziel Dateien mit gleichen Namen vorhanden sind, werden diese weder geändert noch überschrieben - es wird quasi nichts von dem Script ausgeführt - außer mit der Else-Anweisung - ggf. die Dateien im Quellverzeichniss gelöscht (sh. oben). Hast Du da ev. noch eine Lösung ???
Öhm... genau das wolltest du doch auch so haben?! Sofern die Datei in dem Ziel vorhanden ist, wird geprüft, ob diese Größer als die Datei aus der Quelle ist. Wenn die Datei im Ziel also größer ist, passiert dort auch nichts.
Jetzt wo du's sagst
wo stelle ich das ein bzw. richtig ???
gci "d:\Quellestart" -File | ?{$_.Basename -match '\d{4}-\d{2}'} | %{
$ziel = "d:\Quelleziel\$($matches.replace('-','\'))"
if (!(Test-Path $ziel)){md $ziel -Force | out-null}
$dfile = "$ziel\$($_.Name)"
if (((get-item $dfile -EA SilentlyContinue).Length -le $_.Length) -or !(Test-Path $dfile)){
$_ | move-item -Destination $ziel -Force
} else {rm $_.FullName}
}