Script zur Umsortierung von Bild-Dateien unter Windows
Hallo,
ich bitte um Hilfe bei der Erstellung eines komplexeren Scriptes (batch-Datei). Es soll unter Windows 10 laufen und Bilddateien deutlich einfacher auffindbar und aufrufbar machen.
aktuelle Situation:
- auf einem Laufwerk gibt es ca. 10.000 Ordner, unregelmäßig (nicht fortlaufend) nummeriert, also 1, 2, 4, 7, 12 u.s.w.
- das Script soll, sagen wir immer 100 dieser Ordner (damit ich den Erfolg immer rechtzeitig prüfen und ggf.abbrechen kann), die ich im Script eintrage (also z.b. ordner 201 bis 300) bearbeiten
- in jedem dieser Ordner gibt es ein oder mehrere Unterverzeichnisse, deren Namen das Erstellungsdatum (leider) im Format M.T.J (z.B. 4.25.2015) und weiteres (sicher die Uhrzeit) enthält.
- dieses Datum ist wichtig, das Script soll es auslesen und in derselben Verzeichnisebene einen neuen Ordner mit dem Namen JJJJ-MM-TT erstellen
- im Original-Ordner (M.T.J, siehe oben) gibt es immer 4 Unterordner. Von diesen 4 Unterordnern heißt einer "Images"
- in diesem Unterordner liegen neben anderen Dateien und weiteren Unterordnern die Bilddateien (im .tif - Format).
ich möchte, das:
- alle diese .tif-Dateien in den neu erstellen Ordner mit dem korrekten Namen ( JJJJ-MM-TT) verschoben werden
- möglichst soll auch der Dateiname verändert werden "Image1" bis ImageXY
- alle Unterordner und Dateien , die im Originalen Ordner (M.T.J) liegen, sollen nachfolgend gelöscht werden, einschließlich dieses Ordners selber.
Zur Veransschaulichung:
(Laufwerk) K:\
(Ordner)1
4.25.2015-fefvvvvv
Unterordner1
Unterordner2
Images
Order xyz
Ordner abc
Datei xyz
imagexyz.tif
imageabc.tif
Unterordner4
soll werden zu:
(Ordner)1
2015-04-25
image1
image2
Ich würde denken, als erstes muß das Script das Datum des Originalordners erkennen und einen korrekten neuen Ordner erstellen.
Danach muß das Script im richtigen Unterordner (images) alle .tif-Dateien dahin verschieben, gleichzeitig umbenennen
Ich möchte eine gewisse Steuerung behalten, das Script soll erstmal von ordner 1 bis 100 arbeiten, danach 101 bis 200 u.s.w.
Ich bin über Hilfe sehr dankbar!
Alexander
ich bitte um Hilfe bei der Erstellung eines komplexeren Scriptes (batch-Datei). Es soll unter Windows 10 laufen und Bilddateien deutlich einfacher auffindbar und aufrufbar machen.
aktuelle Situation:
- auf einem Laufwerk gibt es ca. 10.000 Ordner, unregelmäßig (nicht fortlaufend) nummeriert, also 1, 2, 4, 7, 12 u.s.w.
- das Script soll, sagen wir immer 100 dieser Ordner (damit ich den Erfolg immer rechtzeitig prüfen und ggf.abbrechen kann), die ich im Script eintrage (also z.b. ordner 201 bis 300) bearbeiten
- in jedem dieser Ordner gibt es ein oder mehrere Unterverzeichnisse, deren Namen das Erstellungsdatum (leider) im Format M.T.J (z.B. 4.25.2015) und weiteres (sicher die Uhrzeit) enthält.
- dieses Datum ist wichtig, das Script soll es auslesen und in derselben Verzeichnisebene einen neuen Ordner mit dem Namen JJJJ-MM-TT erstellen
- im Original-Ordner (M.T.J, siehe oben) gibt es immer 4 Unterordner. Von diesen 4 Unterordnern heißt einer "Images"
- in diesem Unterordner liegen neben anderen Dateien und weiteren Unterordnern die Bilddateien (im .tif - Format).
ich möchte, das:
- alle diese .tif-Dateien in den neu erstellen Ordner mit dem korrekten Namen ( JJJJ-MM-TT) verschoben werden
- möglichst soll auch der Dateiname verändert werden "Image1" bis ImageXY
- alle Unterordner und Dateien , die im Originalen Ordner (M.T.J) liegen, sollen nachfolgend gelöscht werden, einschließlich dieses Ordners selber.
Zur Veransschaulichung:
(Laufwerk) K:\
(Ordner)1
4.25.2015-fefvvvvv
Unterordner1
Unterordner2
Images
Order xyz
Ordner abc
Datei xyz
imagexyz.tif
imageabc.tif
Unterordner4
soll werden zu:
(Ordner)1
2015-04-25
image1
image2
Ich würde denken, als erstes muß das Script das Datum des Originalordners erkennen und einen korrekten neuen Ordner erstellen.
Danach muß das Script im richtigen Unterordner (images) alle .tif-Dateien dahin verschieben, gleichzeitig umbenennen
Ich möchte eine gewisse Steuerung behalten, das Script soll erstmal von ordner 1 bis 100 arbeiten, danach 101 bis 200 u.s.w.
Ich bin über Hilfe sehr dankbar!
Alexander
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 577783
Url: https://administrator.de/contentid/577783
Ausgedruckt am: 22.11.2024 um 19:11 Uhr
16 Kommentare
Neuester Kommentar
Moin,
ein schönes Projekt, um programmieren zu lernen. Wenn Du es wirklich hard core willst, mache es mit einem batch. Wenn Du es sehr viel logischer, besser aufgebaut und vor allem mächtiger willst, dann nimm dafür die Powershell.
https://docs.microsoft.com/de-de/powershell/
Da guckst du nach den Befehlen get-childitem, get-date, der Methode split(), Schleifenprogrammierung und los geht's. Ich sitze gerade am falschen Rechner. Da habe ich den Link nicht. Aber ich empfehle gerne noch ein open book. Guck mal in älteren Beiträgen von mir zum Thema Powershell.
Wenn Du dann ein paar Zeilen hast, frage gerne wieder.
Liebe Grüße
Erik
ein schönes Projekt, um programmieren zu lernen. Wenn Du es wirklich hard core willst, mache es mit einem batch. Wenn Du es sehr viel logischer, besser aufgebaut und vor allem mächtiger willst, dann nimm dafür die Powershell.
https://docs.microsoft.com/de-de/powershell/
Da guckst du nach den Befehlen get-childitem, get-date, der Methode split(), Schleifenprogrammierung und los geht's. Ich sitze gerade am falschen Rechner. Da habe ich den Link nicht. Aber ich empfehle gerne noch ein open book. Guck mal in älteren Beiträgen von mir zum Thema Powershell.
Wenn Du dann ein paar Zeilen hast, frage gerne wieder.
Liebe Grüße
Erik
Zitat von @Shadowminder:
ich schau mal was sich mit Batch machen lässt, wenn ich ein fertiges Produkt habe melde ich mich!
ich schau mal was sich mit Batch machen lässt, wenn ich ein fertiges Produkt habe melde ich mich!
Wer das heute statt mit der Powershell mit der alten Batchsprache macht, ist eindeutig ein Masochist.
Servus Alexander,
probiere mal das folgende Powershell-Skript ob das deinen Erwartungen entspricht (Pfad in Zeile 2 bitte anpassen)
Alternativ kann das die Powershell auch alles simulieren und nur anzeigen was sie tun würde. Dafür haben fast alle CMDLets den Parameter -whatif mit dem man auch gut sehen kann ob alles so läuft wie gewünscht.
Grüße Uwe
probiere mal das folgende Powershell-Skript ob das deinen Erwartungen entspricht (Pfad in Zeile 2 bitte anpassen)
# Pfad bitte anpassen
$root = 'K:\Bilder'
$batch = 0
ls $root -Directory | %{
if ($batch % 100 -eq 0){
Read-Host "`nEnter drücken zum fortfahren für den nächsten Batch an Ordnern"
}
ls $_.FullName -Directory | ?{$_.Name -match '(\d{1,2})\.(\d{1,2})\.(\d{4})'} | %{
$newfolder = (Join-Path $_.Parent.FullName ([datetime]::ParseExact($matches,'M.d.yyyy',[cultureinfo]::InvariantCulture).toString('yyyy-MM-dd')))
md $newfolder -Force | out-null
$cnt = 1
ls "$($_.FullName)\Images" -File -Filter *.tif | %{
move-item $_.Fullname -Destination "$newfolder\$($_.BaseName)$cnt$($_.Extension)" -Verbose
$cnt++
}
del $_.FullName -Force -Recurse
}
$batch++
}
Ich möchte eine gewisse Steuerung behalten, das Script soll erstmal von ordner 1 bis 100 arbeiten, danach 101 bis 200 u.s.w.
Ich hab dir das zwar oben eingebaut, aber sowas macht man eigentlich immer erst mal in einem Test-Ordner in den man die Quell-Daten hineinkopiert und dann das Skript darauf loslässt.Alternativ kann das die Powershell auch alles simulieren und nur anzeigen was sie tun würde. Dafür haben fast alle CMDLets den Parameter -whatif mit dem man auch gut sehen kann ob alles so läuft wie gewünscht.
Grüße Uwe
In der Ebene des Ordners, dessen Name umbenannt wird (das Datum im Formal YYYY-MM-dd) gibt es noch mehrere Steuer-Dateien, die alle gelöscht werden können.
wie gelingt es, die Bild-Dateien umzubenennen? Fortlaufend, z.B. YYYY-MM-DD_Image1, YYYY-MM-DD_Image2 etc.?
wie gelingt es, die Bild-Dateien umzubenennen? Fortlaufend, z.B. YYYY-MM-DD_Image1, YYYY-MM-DD_Image2 etc.?
Habe dir mal als erste Hilfe Kommentare ergänzt.
# Pfad bitte anpassen
$root = 'K:\Bilder'
$batch = 0
# Abfrage aller Ordner der ersten Ebene im Root-Ordner
ls $root -Directory | %{
# alle 1000 Ordner anhalten und fragen
if ($batch % 1000 -eq 0){
Read-Host "`nEnter drücken zum fortfahren für den nächsten Batch an Ordnern"
}
# Unterordner abfragen deren Namen dem Datumsmuster entspricht
ls $_.FullName -Directory | ?{$_.Name -match '(\d{1,2})\.(\d{1,2})\.(\d{4})'} | %{
# Datum neu formatieren und an Variable übergeben
$d = [datetime]::ParseExact($matches,'M.d.yyyy',[cultureinfo]::InvariantCulture).toString('yyyy-MM-dd')
# neuen Ordner eine Ebene höher erstellen
$newfolder = (Join-Path $_.Parent.FullName $d)
md $newfolder -Force | out-null
# Zähler initialisieren
$cnt = 1
# Alle *.tif Dateien des Unterordner "Images" in den neuen Ordner unter neuem Namen verschieben
ls "$($_.FullName)\Images" -File -Filter *.tif | %{
move-item $_.Fullname -Destination "$newfolder\${d}_Image$cnt$($_.Extension)" -Verbose
$cnt++
}
# alten Ordner rekursiv löschen
del $_.FullName -Force -Recurse
}
# evt. Steuerdateien löschen
ls $_.Fullname -File | del -Force
$batch++
}
Offensichtlich benötigt man Split-Path.
Nein, viel einfacher.Lass dir einfach mal auf der Konsole die verfügbaren Eigenschaften des Objekts in der Schleife anzeigen
# ....
$_.Parent | Get-Member *
# ....
Ergo
Join-Path $_.Parent.Parent.FullName $d
Du kannst natürlich auch "K:\" als festen Pfad in der Angabe nutzen, dann ist das Skript aber abhängig von der Verfügbarkeit des Pfades und man muss es manuell ändern wenn man es woanders anwendet.
Grüße Uwe
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen, und Lösungen markieren. Merci.