Powershell Copy und Rename Wildcard Replacement
Hallo Experten-Team,
meine Powershell Fähigkeiten sind leider etwas schmal. Vielleicht könnt ihr weiterhelfen
Ich habe eine Excel mit folgenden nebeneinander liegenden Spalten:
Spalte A: alter Ordnername
Spalte B: Alter Dateiname
Spalte C: neuer Ordnername
Spalte D: Neuer Dateiname.
Ich suche ein Script was die Excel einliest und folgendes tut:
1. Gehe in Ordner X (Spalte A)
2. Kopiere alle Dateien die du darin findest in einen neuen Ordner (Spalte C)
3. Ändere den Dateinamen von alt (Spalte B) auf neu (Spalte D).
Soweit noch simpel und jetzt das Problem:
Die Dateien in der alten Ordnerstruktur sind so aufgebaut:
20_03_2019_Giraffe_12345_1.jpg
20_03_2019_Giraffe_12345_2.jpg usw.
Ich möchte das die Hochzählung im neuen Datei Format erhalten bleibt. Allerdings soll nur die 12345 ausgetauscht werden.
Der neue Name klingt also:
20_03_2019_Giraffe_56789_1.jpg
20_03_2019_Giraffe_56789_2.jpg
Wie stelle ich das an? :/ Bin für ein Script dankbar
mfg
Lupora
meine Powershell Fähigkeiten sind leider etwas schmal. Vielleicht könnt ihr weiterhelfen
Ich habe eine Excel mit folgenden nebeneinander liegenden Spalten:
Spalte A: alter Ordnername
Spalte B: Alter Dateiname
Spalte C: neuer Ordnername
Spalte D: Neuer Dateiname.
Ich suche ein Script was die Excel einliest und folgendes tut:
1. Gehe in Ordner X (Spalte A)
2. Kopiere alle Dateien die du darin findest in einen neuen Ordner (Spalte C)
3. Ändere den Dateinamen von alt (Spalte B) auf neu (Spalte D).
Soweit noch simpel und jetzt das Problem:
Die Dateien in der alten Ordnerstruktur sind so aufgebaut:
20_03_2019_Giraffe_12345_1.jpg
20_03_2019_Giraffe_12345_2.jpg usw.
Ich möchte das die Hochzählung im neuen Datei Format erhalten bleibt. Allerdings soll nur die 12345 ausgetauscht werden.
Der neue Name klingt also:
20_03_2019_Giraffe_56789_1.jpg
20_03_2019_Giraffe_56789_2.jpg
Wie stelle ich das an? :/ Bin für ein Script dankbar
mfg
Lupora
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 542927
Url: https://administrator.de/contentid/542927
Ausgedruckt am: 22.11.2024 um 12:11 Uhr
17 Kommentare
Neuester Kommentar
Moin,
wenn ich das richtig verstehe hast du also ein Excel-Problem, weil ja der neue Dateiname in der Spalte D steht...
Gruß
Zitat von @Lupora:
Ich möchte das die Hochzählung im neuen Datei Format erhalten bleibt. Allerdings soll nur die 12345 ausgetauscht werden.
Der neue Name klingt also:
Ich möchte das die Hochzählung im neuen Datei Format erhalten bleibt. Allerdings soll nur die 12345 ausgetauscht werden.
Der neue Name klingt also:
wenn ich das richtig verstehe hast du also ein Excel-Problem, weil ja der neue Dateiname in der Spalte D steht...
Gruß
Moin,
Der vollständige Pfad?
Der vollständige Dateiname oder nur "Giraffe" oder ein anderer Teilname?
Auch hier: Der vollständige Pfad?
Dieselbe Frage: Der vollständige Name oder nur 56789?
ok
Auch kein Problem.
Könnte man im gleichen Schritt miterledigen.
Auch das ist kein Problem. Aber der Aufbau ist mir noch nicht wirklich klar. Sind es immer fünf Ziffern, die im Namen geändert werden sollen? Sind es nur Ziffern oder auch Buchstaben?
Liebe Grüße
Erik
Zitat von @Lupora:
Ich habe eine Excel mit folgenden nebeneinander liegenden Spalten:
Spalte A: alter Ordnername
Ich habe eine Excel mit folgenden nebeneinander liegenden Spalten:
Spalte A: alter Ordnername
Der vollständige Pfad?
Spalte B: Alter Dateiname
Der vollständige Dateiname oder nur "Giraffe" oder ein anderer Teilname?
Spalte C: neuer Ordnername
Auch hier: Der vollständige Pfad?
Spalte D: Neuer Dateiname.
Dieselbe Frage: Der vollständige Name oder nur 56789?
Ich suche ein Script was die Excel einliest und folgendes tut:
1. Gehe in Ordner X (Spalte A)
1. Gehe in Ordner X (Spalte A)
ok
2. Kopiere alle Dateien die du darin findest in einen neuen Ordner (Spalte C)
Auch kein Problem.
3. Ändere den Dateinamen von alt (Spalte B) auf neu (Spalte D).
Könnte man im gleichen Schritt miterledigen.
Soweit noch simpel und jetzt das Problem:
Die Dateien in der alten Ordnerstruktur sind so aufgebaut:
20_03_2019_Giraffe_12345_1.jpg
20_03_2019_Giraffe_12345_2.jpg usw.
Ich möchte das die Hochzählung im neuen Datei Format erhalten bleibt. Allerdings soll nur die 12345 ausgetauscht werden.
Der neue Name klingt also:
20_03_2019_Giraffe_56789_1.jpg
20_03_2019_Giraffe_56789_2.jpg
Die Dateien in der alten Ordnerstruktur sind so aufgebaut:
20_03_2019_Giraffe_12345_1.jpg
20_03_2019_Giraffe_12345_2.jpg usw.
Ich möchte das die Hochzählung im neuen Datei Format erhalten bleibt. Allerdings soll nur die 12345 ausgetauscht werden.
Der neue Name klingt also:
20_03_2019_Giraffe_56789_1.jpg
20_03_2019_Giraffe_56789_2.jpg
Auch das ist kein Problem. Aber der Aufbau ist mir noch nicht wirklich klar. Sind es immer fünf Ziffern, die im Namen geändert werden sollen? Sind es nur Ziffern oder auch Buchstaben?
Liebe Grüße
Erik
bedingt. Warum fehlen in der Spalte des alten Dateinamens deine "Hochzählzeichen"?
Moin,
Ja, war sie. Ich hatte gestern nur keine Zeit mehr. Erstmal zur Ausgangsdatei:
1. Speichere sie als csv.
2. Die hässlichen Leerzeichen müssen aus den Spaltennamen. Mein Skript erwartet:
3. In die Spalten der Ordner kommt nur der nackte Ordnername ohne Pfad.
4. In die Spalte neuername kommt nur die Zeichenfolge, die ersetzt wird ohne das, was davor oder dahinter steht.
Die Datei sieht also so aus:
Und so das Skript:
hth
Erik
Ja, war sie. Ich hatte gestern nur keine Zeit mehr. Erstmal zur Ausgangsdatei:
1. Speichere sie als csv.
2. Die hässlichen Leerzeichen müssen aus den Spaltennamen. Mein Skript erwartet:
altername
neuername
alterordner
neuerordner
4. In die Spalte neuername kommt nur die Zeichenfolge, die ersetzt wird ohne das, was davor oder dahinter steht.
Die Datei sieht also so aus:
alterordner neuerordner altername neuername
1234 5678 2019_11_25_TEST_778123436548924_ 778123436548988
1234 5678 2019_11_25_TEST_778123436548989_ 778123436548123
Und so das Skript:
param(
[Parameter(mandatory=$true)]
$file, # Die Übergabe der CSV-Datei
[Parameter(mandatory=$true)]
$oldpath, # Der Pfad zum alten Ordner
[Parameter(mandatory=$true)]
$newpath # Der Pfad zum neuen Ordner
)
[regex]$regex = "^(\d{4}_\d{2}_\d{2}_.+?)_.+?(_.*)$"
$data = Import-Csv $file -Delimiter ";" -Encoding UTF8
foreach($dataset in $data) {
$files = Get-ChildItem "$oldpath\$($dataset.alterordner)\$($dataset.altername)*"
$new = $dataset.neuername
if(-not (test-path $newpath\$($dataset.neuerordner))) {
New-Item -Name $newpath\$($dataset.neuerordner) -type directory
}
foreach ($oldfile in $files) {
$newfile = $oldfile.name
$newfile = $newfile -replace $regex,"`$1_$new`$2"
$newfile = $newpath + "\" + $($dataset.neuerordner) + "\" + $newfile
move-item -path $oldfile.fullname -destination $newfile
}
}
hth
Erik
Zitat von @Lupora:
Herzlichen Dank für die ganze Mühe. Das sieht schon sehr gut aus!
Habe es gerade ausgeführt und folgende Fehlermeldung bekommen:
Vermutung: Manchmal ist der alte und der neue Ordnername identisch. Es wirkt als verschlucke er sich daran, weil er davon ausgeht das Spalte alter ordner / neuer ordner immer unterschiedlich sind.
Herzlichen Dank für die ganze Mühe. Das sieht schon sehr gut aus!
Habe es gerade ausgeführt und folgende Fehlermeldung bekommen:
newpath: C:\Users\XXX\Desktop\YYYY\ZZZZ\ZZZ
> Import-Csv : The member "7781999594424" is already present.
> At C:\Users\XXX\Desktop\shell.ps1:14 char:9
> + $data = Import-Csv $file -Delimiter ";" -Encoding UTF8
> + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> + CategoryInfo : NotSpecified: (:) [Import-Csv], ExtendedTypeSystemException
> + FullyQualifiedErrorId : AlreadyPresentPSMemberInfoInternalCollectionAdd,Microsoft.PowerShell.Commands.ImportCsvCommand
Vermutung: Manchmal ist der alte und der neue Ordnername identisch. Es wirkt als verschlucke er sich daran, weil er davon ausgeht das Spalte alter ordner / neuer ordner immer unterschiedlich sind.
Ich vermute eher, dass die Überschriften nicht stimmen. Dem Skript ist das vollkommen egal, ob der Ordner unterschiedlich oder der gleiche ist.
Zitat von @Lupora:
Und noch kleiner Hinweis: Könnte man es so konfigurieren das er die Ordner kopiert und nicht verschiebt?
Habe das SCript gerade mit drei Ordnern laufen lassen (test). Nach der Script Ausführung ist alles im alten Ordner weg und in den neuen sortiert.
Und noch kleiner Hinweis: Könnte man es so konfigurieren das er die Ordner kopiert und nicht verschiebt?
Habe das SCript gerade mit drei Ordnern laufen lassen (test). Nach der Script Ausführung ist alles im alten Ordner weg und in den neuen sortiert.
Ja klar. Das wolltest Du doch.
Aus SIcherheitsgründen wäre es super, wenn es nur copy anstatt move wäre
Dann statt move-item einfach copy-item.
Moin,
Wie schrieb ich nicht gleich:
Das ist mein unverändertes Skript, wenn ich das richtig sehe? Dann klappt das, wenn die Spalten die korrekten Überschriften haben. Für's Verständnis: Der Befehl import-csv legt ein Array aus Objekten aus den Datensätzen der CSV an. Die Eigenschaften der Objekte sind die Spaltenüberschriften der CSV und die Werte dieser Eigenschaften sind die Daten selbst. So kann ich dann z. B. mit
auf den alten Dateinamen des aktuellen Objekts zugreifen. MaW: Die Überschriften sind schon wichtig und sollten deshalb auch keine Leerzeichen enthalten.
Liebe Grüße
Erik
Zitat von @Lupora:
Ich wusste nicht das die CSV Überschriften haben muss. Dachte das war eher zu Orientierung.
Ich wusste nicht das die CSV Überschriften haben muss. Dachte das war eher zu Orientierung.
Wie schrieb ich nicht gleich:
2. Die hässlichen Leerzeichen müssen aus den Spaltennamen. Mein Skript erwartet:
altername
neuername
alterordner
neuerordner
Das ist das Script:
Das ist mein unverändertes Skript, wenn ich das richtig sehe? Dann klappt das, wenn die Spalten die korrekten Überschriften haben. Für's Verständnis: Der Befehl import-csv legt ein Array aus Objekten aus den Datensätzen der CSV an. Die Eigenschaften der Objekte sind die Spaltenüberschriften der CSV und die Werte dieser Eigenschaften sind die Daten selbst. So kann ich dann z. B. mit
$dataset.altername
auf den alten Dateinamen des aktuellen Objekts zugreifen. MaW: Die Überschriften sind schon wichtig und sollten deshalb auch keine Leerzeichen enthalten.
Liebe Grüße
Erik