Dateinamen auslesen dazugehörige Datei suchen und umbenennen
Hätte mal wieder eine Frage an die Batch Experten.
Habe eine Datei mit dem Orginal Namen und möchte daß die dazugehörigen zwei Datein gesucht und angeglichen werden.
z.B.:
Orginal Datei: CH Blitzer fest 60kmh.csv
Die zu suchenden Dateien:
BlitzerCHF60igpepja.bmp
BlitzerCHF60epdillg.upi
BlitzerCHF60epdillg.bmp
Wunschergebnis:
BlitzerCHF60igpepja.upi in CH Blitzer fest 60kmh.upi
Da ich ca. 500 Dateien habe ist es mühselig alles per Hand umzubenennen.
Habe nur keine Idee wie ich das per Batch realisieren kann.
Es gibt folgende Varianten
Folgende Texte sind gleich:
CH
Blitzer
fest = F
60kmh = 60
CH Blitzer fest 60kmh
BlitzerCHF60
Gruß Klaus
Habe eine Datei mit dem Orginal Namen und möchte daß die dazugehörigen zwei Datein gesucht und angeglichen werden.
z.B.:
Orginal Datei: CH Blitzer fest 60kmh.csv
Die zu suchenden Dateien:
BlitzerCHF60igpepja.bmp
BlitzerCHF60epdillg.upi
BlitzerCHF60epdillg.bmp
Wunschergebnis:
BlitzerCHF60igpepja.upi in CH Blitzer fest 60kmh.upi
Da ich ca. 500 Dateien habe ist es mühselig alles per Hand umzubenennen.
Habe nur keine Idee wie ich das per Batch realisieren kann.
Es gibt folgende Varianten
Folgende Texte sind gleich:
CH
Blitzer
fest = F
60kmh = 60
CH Blitzer fest 60kmh
BlitzerCHF60
Gruß Klaus
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 380627
Url: https://administrator.de/contentid/380627
Ausgedruckt am: 22.11.2024 um 17:11 Uhr
13 Kommentare
Neuester Kommentar
Powershell
Grüße Uwe
# Ordner mit den Dateien
$folder = 'D:\Blitzer'
# für jede CSV-Datei im Ordner die auf das Muster passt
gci $folder -filter *.csv -pipelinevariable file | ?{$_.Basename -match '^([^\s]+) ([^\s]+) (.)[^\s]+ (\d+)'} | %{
# finde passende *.bmp und *.upi Dateien und benenne sie nach dem Basename der CSV Datei
gci "$folder\$($matches[2])$($matches[1])$($matches[3])$($matches[4])*" -Include "*.bmp","*.upi" | rename-item -NewName {"$($file.Basename)$($_.Extension)"} -Verbose
}
Kommentare stehen im Skript falls du das noch nicht bemerkt haben solltest.
Zum Starten von Powershell hier
, meine Standardanleitung, man muss ja nicht alles 1000 mal wiederholen, Standardkost dir du an jeder Ecke nachlesen kannst:
Liegt das Script im selben Verzeichnis in dem man sich gerade befindet, kann man es auch so abkürzen:
Der einfachste Aufruf sieht hier so aus:
Wenn man dem Script Parameter übergeben möchte:
Wenn man "benannte" Parameter übergeben möchte (die einfachen Hochkommas um den Scriptpfad werden benötigt wenn er Leerzeichen beinhaltet):
Man kann auch mehrere Scripte hintereinander ausführen lassen:
Weitere Parameter zeigt einem ein
Zum Starten von Powershell hier
, meine Standardanleitung, man muss ja nicht alles 1000 mal wiederholen, Standardkost dir du an jeder Ecke nachlesen kannst:
Anleitung: Wie starte ich Powershell-Scripte
- Zuerst speichert man den Code in einer Textdatei mit der Endung .ps1.
- Wenn man zum ersten mal Powershell-Scripte ausführt, musst man einmalig vorher noch das Ausführen von Scripten im User-Account freischalten. Dazu öffnet man eine administrative Powershell-Konsole und gibt dort den Befehl
Set-ExecutionPolicy RemoteSigned -Force
ein. Um diese Policy für alle User auf dem Rechner zu setzen muss man diesen Befehl in einer Powershell-Konsole mit Admin-Rechten starten. Noch ein Hinweis für 64-Bit-Systeme: Hier sollte sowohl für die 32bit und 64Bit Variante der Powershell die Policy in einer Admin-Konsole gesetzt werden:Set-ExecutionPolicy RemoteSigned -Force; start-job { Set-ExecutionPolicy RemoteSigned -Force } -RunAs32
- Jetzt kann das Powershell-Script wie weiter unten erläutert in einer Powershell-Konsole oder aus einer CMD-Fenster heraus ausgeführt werden. Wer lieber mit der Maus arbeitet macht einen Rechtsklick auf die Script-Datei und wählt: Mit Powershell ausführen.
- Alternativ lässt sich ein Script auch ohne das globale Ändern der ExecutionPolicy ausführen indem man die Policy als Parameter auf der Kommandozeile mitgibt:
powershell.exe -ExecutionPolicy ByPass -File "C:\Pfad\Script.ps1"
Starten eines Scriptes in einer Powershell-Konsole
Immer den kompletten Pfad zum Script angeben, und wenn er Leerzeichen beinhaltet in Anführungszeichen einschließen:"C:\Pfad\script.ps1"
.\script.ps1
Starten von PS-Scripten aus Batch und Kommandozeilen heraus:
Hier gibt es unterschiedliche Methoden, je nach Anforderungen gibt es hier einige Besonderheiten vor allem bei Leerzeichen in Pfaden zu beachten!Der einfachste Aufruf sieht hier so aus:
powershell.exe -File "C:\Pfad\Script.ps1"
powershell.exe -File "C:\Pfad\Script.ps1" "Parameter 1" "Parameter 2"
powershell.exe -command "&'C:\Pfad\Script.ps1' -par1 'Wert1' -par2 'Wert2'"
powershell.exe -command "&'C:\Pfad\Script1.ps1';&'C:\Pfad\Script2.ps1'"
powershell -?
in einer Konsole an.Starten von PS-Scripten in der Aufgabenplanung (Taskplaner)
In der jeweiligen Aktion unter "Programm/Script" trägt man powershell.exe ein und unter "Argumente hinzufügen (optional)" trägt man wie oben geschrieben alles was hinter powershell.exe kommt ein - also z.B. -File "C:\Pfad\Script.ps1" "Parameter 1" "Parameter 2"Zitat von @Klaus20:
Habe mittlerweile alles freigeschaltet und kann das Script in der Konsole starten es passiert allerdings nichts.
Folgende Dateien sin im Verzeichnis D:\Blitzer vorhanden
CH Blitzer fest 60kmh.csv
CH Blitzer fest 70kmh.csv
BlitzerCHFA70ipmckfj.bmp
BlitzerCHFA70ipmckfj.upi
BlitzerCHFA60epdillg.bmp
BlitzerCHFA60epdillg.upi
und das script test.ps1
Was mache ich nun schon wieder falsch ??
Kein Wunder, denn deine Dateinamen entsprechen nicht deinem geschilderten Muster im Ursprungspost, hier hast du ein A zwischen dem F und der Geschwindigkeit, das stand in deiner Beschreibung nirgendwo, wie soll man das dann ahnen! Also mal wieder selbst schuld :-P.Habe mittlerweile alles freigeschaltet und kann das Script in der Konsole starten es passiert allerdings nichts.
Folgende Dateien sin im Verzeichnis D:\Blitzer vorhanden
CH Blitzer fest 60kmh.csv
CH Blitzer fest 70kmh.csv
BlitzerCHFA70ipmckfj.bmp
BlitzerCHFA70ipmckfj.upi
BlitzerCHFA60epdillg.bmp
BlitzerCHFA60epdillg.upi
und das script test.ps1
Was mache ich nun schon wieder falsch ??
Also was ist nun Fakt? Kommt da nach dem F immer ein A oder was anderes oder auch mal nichts?
Bischen spät aber ich musste noch mein Ticket von letztes mal "§Autobahn" bezahlen ;-P. Hoffen wir mal das dir das hiermit jetzt nicht mehr passiert .
Hiermit Regular Expressions Tutorial
Willkommen in der Regex-Hölle
Wat kommt als nächstes? Tomaten in Bananen verwandeln ??
That's it i'm out.
Uwe
Spenden sind immer willkommen.
Hiermit Regular Expressions Tutorial
z.B.: Folgende Dateien will er noch nicht.
IT Blitzer fest Abschnittskontrolle 120kmh.csv
BlitzerITFAbschnittskontrolle120dnbdmkn.upi
BlitzerAFAbschnittskontrollefolhgoh.upi
A Blitzer fest Abschnittskontrolle.csv
BlitzerAFAbschnittskontrolleEndelldhpde.upi
A Blitzer fest Abschnittskontrolle Ende.csv
BlitzerAFAttrappenobjohfe.upi
A Blitzer fest Attrappen.csv
BlitzerAFvariabelmbploah.upi
A Blitzer fest variabel.csv
BlitzerAFAihbngen.upi
A Blitzer fest Ampel.csv
IT Blitzer fest Abschnittskontrolle 120kmh.csv
BlitzerITFAbschnittskontrolle120dnbdmkn.upi
BlitzerAFAbschnittskontrollefolhgoh.upi
A Blitzer fest Abschnittskontrolle.csv
BlitzerAFAbschnittskontrolleEndelldhpde.upi
A Blitzer fest Abschnittskontrolle Ende.csv
BlitzerAFAttrappenobjohfe.upi
A Blitzer fest Attrappen.csv
BlitzerAFvariabelmbploah.upi
A Blitzer fest variabel.csv
BlitzerAFAihbngen.upi
A Blitzer fest Ampel.csv
Willkommen in der Regex-Hölle
# Ordner mit den Dateien
$folder = 'D:\Blitzer'
# für jede CSV-Datei im Ordner die auf das Muster passt
gci $folder -filter *.csv -pipelinevariable file | ?{$_.Basename -match '^([^\s]+) ([^\s]+) (.)[^\s]+( ([^\s]+))?((( (\d+|[^\s]+))?(kmh)?)|(( ((.)[^\s]+))))$'} | %{
# Variante an Submatch erkennen
if ($matches[7]){
$filter = "$folder\$($matches[2])$($matches[1])$($matches[3])$($matches[5])$($matches[9])*"
}else{
$filter = "$folder\$($matches[2])$($matches[1])$($matches[3])$($matches[14])*"
}
# finde passende *.bmp und *.upi Dateien und benenne sie nach dem Basename der CSV Datei
gci $filter -Include "*.bmp","*.upi" | rename-item -NewName {"$($file.Basename)$($_.Extension)"} -Verbose -ea 0
}
Wat kommt als nächstes? Tomaten in Bananen verwandeln ??
That's it i'm out.
Uwe
Spenden sind immer willkommen.
Servus Klaus,
das zu erklären würde Wochen dauern. Ich habe dir oben den Link zum Regex-Tutorial gegeben, das sind die Grundlagen die du dafür benötigst. Die Klammern der Regular Expression entsprechen den Submatches der Variablen $matches[x], d.h. die erste Klammer ist der erste Submatch und mit $matches[1] anzusprechen, der zweite mit $matches[2] usw. Die Reihenfolge der Klammern geht von außen nach innen, d.h. wenn Klammern verschachtelt sind ist die innere immer der nächste Index.
Da nach deinem weiteren Post immer weitere Varianten kamen musste eine weitere Fallunterscheidung dazu kommen (If-Abfrage).
Btw. es wäre schön gewesen wenn du direkt alle Varianten in deinem Ursprungspost aufgezählt hättest und nicht alles erst tröpfchenweise , wir sind hier zwar ziemlich gut mit unseren Glaskugeln aber seine Grenzen hat das auch, so hat hier vermutlich keiner mehr die Muße noch weiter zu machen, wer weiß was noch alles kommt. Da ist mir zumindest meine Zeit doch zu schade, und der Nutzen des Threads für andere User doch ziemlich begrenzt. Sorry. Aber vielleicht ein Ansporn sich intensiver mit Regex zu beschäftigen, du wirst es nicht bereuen, da mit ist so ziemlich alles möglich.
Viel Erfolg.
Grüße Uwe
das zu erklären würde Wochen dauern. Ich habe dir oben den Link zum Regex-Tutorial gegeben, das sind die Grundlagen die du dafür benötigst. Die Klammern der Regular Expression entsprechen den Submatches der Variablen $matches[x], d.h. die erste Klammer ist der erste Submatch und mit $matches[1] anzusprechen, der zweite mit $matches[2] usw. Die Reihenfolge der Klammern geht von außen nach innen, d.h. wenn Klammern verschachtelt sind ist die innere immer der nächste Index.
Da nach deinem weiteren Post immer weitere Varianten kamen musste eine weitere Fallunterscheidung dazu kommen (If-Abfrage).
Btw. es wäre schön gewesen wenn du direkt alle Varianten in deinem Ursprungspost aufgezählt hättest und nicht alles erst tröpfchenweise , wir sind hier zwar ziemlich gut mit unseren Glaskugeln aber seine Grenzen hat das auch, so hat hier vermutlich keiner mehr die Muße noch weiter zu machen, wer weiß was noch alles kommt. Da ist mir zumindest meine Zeit doch zu schade, und der Nutzen des Threads für andere User doch ziemlich begrenzt. Sorry. Aber vielleicht ein Ansporn sich intensiver mit Regex zu beschäftigen, du wirst es nicht bereuen, da mit ist so ziemlich alles möglich.
Viel Erfolg.
Grüße Uwe