klaus20
Goto Top

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

Content-ID: 380627

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

Ausgedruckt am: 22.11.2024 um 17:11 Uhr

colinardo
Lösung colinardo 19.07.2018 aktualisiert um 10:37:38 Uhr
Goto Top
Powershell
# 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  
}
Grüße Uwe
Klaus20
Klaus20 19.07.2018 um 21:31:00 Uhr
Goto Top
Hallo Uwe,
danke für Deine Antwort. Könntest Du mir bitte weiterhelfen da ich von Powershell keine Ahnung habe.
1. Wie starte ich powershell und welche endung muß Dein Script haben ??
2. Könntest Du mir Dein Script erklären ??

Sorry für meine Anfängerfragen.

Gruß Klaus
colinardo
colinardo 19.07.2018, aktualisiert am 20.07.2018 um 09:06:50 Uhr
Goto Top
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:

back-to-topAnleitung: 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"
back-to-topStarten 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"
Liegt das Script im selben Verzeichnis in dem man sich gerade befindet, kann man es auch so abkürzen:
.\script.ps1
back-to-topStarten 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"
Wenn man dem Script Parameter übergeben möchte:
powershell.exe -File "C:\Pfad\Script.ps1" "Parameter 1" "Parameter 2"
Wenn man "benannte" Parameter übergeben möchte (die einfachen Hochkommas um den Scriptpfad werden benötigt wenn er Leerzeichen beinhaltet):
powershell.exe -command "&'C:\Pfad\Script.ps1' -par1 'Wert1' -par2 'Wert2'"
Man kann auch mehrere Scripte hintereinander ausführen lassen:
powershell.exe -command "&'C:\Pfad\Script1.ps1';&'C:\Pfad\Script2.ps1'"
Weitere Parameter zeigt einem ein powershell -? in einer Konsole an.
back-to-topStarten 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"
Klaus20
Klaus20 20.07.2018 um 08:59:02 Uhr
Goto Top
Hallo Uwe,
nochmals Danke auch für Deine Geduld - wede am Wochenende testen und dann berichten.

Gruß Klaus
Klaus20
Klaus20 21.07.2018 um 08:54:05 Uhr
Goto Top
Hallo Uwe,
wäre schön wenn Du mir wieder helfen könntest.

Habe nun folgendes gemacht:

CMD Konsole:
1. Set-ExecutionPolicy RemoteSigned -Force
2. Set-ExecutionPolicy RemoteSigned -Force; start-job { Set-ExecutionPolicy RemoteSigned -Force } -RunAs32

Powershell gestartet
In das Verzeichnis D:/Blitzer gewechselt und das script mit ".\script.ps1" gestartet.

Bekomme nun folgende Meldung:
PS D:\Blitzer> .\script.ps1
.\script.ps1 : Die Datei "D:\Blitzer\script.ps1" kann nicht geladen werden, da der Vorgang durch Richtlinien für die Softwareeinschränkung, z. B. die von der
Gruppenrichtlinie erstellten Richtlinien, blockiert wird.
In Zeile:1 Zeichen:1

back-to-top.\script.ps1

back-to-top~~~~~~~~~~~~

+ CategoryInfo : Sicherheitsfehler: (face-smile , PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess

Gruß Klaus
colinardo
colinardo 21.07.2018 aktualisiert um 09:06:57 Uhr
Goto Top
da der Vorgang durch Richtlinien für die Softwareeinschränkung, z. B. die von der Gruppenrichtlinie erstellten Richtlinien, blockiert wird
Ist doch eindeutig, eure GPOs (SRPs) verbieten PS-Skripte, also geh zu deinem Admin und frage ihn ob er es dir freischaltet face-smile, wenn er denn so gnädig ist.
Klaus20
Klaus20 21.07.2018 um 09:58:04 Uhr
Goto Top
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 ??
Gruß Klaus
colinardo
colinardo 21.07.2018 aktualisiert um 12:00:47 Uhr
Goto Top
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.
Also was ist nun Fakt? Kommt da nach dem F immer ein A oder was anderes oder auch mal nichts?
Klaus20
Klaus20 21.07.2018 um 13:56:28 Uhr
Goto Top
Du hattest mal wieder recht - habe die Namen vertauscht.
Nun geht alles wunderbar - Danke.

Wie kann ich den die Variablen verändern ??
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

Gruß Klaus
colinardo
colinardo 23.07.2018 aktualisiert um 18:44:26 Uhr
Goto Top
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 face-wink.
Zitat von @Klaus20:
Wie kann ich den die Variablen verändern ??
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

Willkommen in der Regex-Hölle face-wink
# 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 face-big-smile??

That's it i'm out.
Uwe

Spenden sind immer willkommen.
Klaus20
Klaus20 25.07.2018 um 09:00:33 Uhr
Goto Top
Nochmals Vielen Dank für die Hilfe - habe nun alles gestestet und das sind wohl die letzten die nicht gehen.
Wäre schön wenn mir jemand die Variablen erklären könnte damit ich mir selber helfen kann und Euch nicht immer belästigen muß.

BlitzerDFAoofncfn.upi
D Blitzer fest Ampel.csv

BlitzerBAFA60ncfhfacBIH.upi
BA Blitzer fest Ampel 60kmh.csv

BlitzerDFAbstandlhigfbe.upi
D Blitzer fest Abstand.csv

BlitzerDFAttrappenhpameak.upi
D Blitzer fest Attrappen.csv

BlitzerDFvariabelbmdneoe.upi
D Blitzer fest variabel.csv

Gruß Klaus
colinardo
colinardo 25.07.2018 aktualisiert um 09:14:03 Uhr
Goto Top
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 face-sad, 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
Klaus20
Klaus20 25.07.2018, aktualisiert am 26.07.2018 um 20:25:06 Uhr
Goto Top
Hallo Uwe,
Danke für die schnelle Antwort.
Daß so viele unterschiedliche Varianten sind merkte ich erst als ich das Script ausgeführ habe - Sorry.
BlitzerBAFA60ncfhfacBIH.upi diese Dateien gibt es für 50,60,70,80,90,100,110 und 120kmh.
Wäre es wohl möglich daß Du mir das Script nochmal so veränderst daß auch die letzten "Blindgänger" erfasst werden.
Danke für die Erklärung, werde mich so bald wie möglich damit befassen. Bin fasziniert vom Tempo und der Effektivität.

Gruß Klaus

Nachtrag:
Habe einiges probiert und komme nicht wirklich weiter.
Wäre schön wenn mir jemand weiterhelfen könnte

Habe in der alten Datei auch noch einen Fehler entdeckt:
Aus BlitzerCHFA60epdillgCHE.upi sollte ->CH Blitzer fest Ampel 60kmh.upi<- ist aber leider ->CH Blitzer fest Ampel.upi <- geworden.