Batch zum umbenennen von Daten in einem Ordner?
Hi zusammen,
ich hab in einem Ordner ziemlich vielen Ausgabe-Dateien. Alle beginnen mit "FreeSpace_" dann kommt der eigentliche Name (z.B.) Breich_der_Daten (statt Leerzeichen, haben sie Unterstriche) und irgendwann kommen noch Datum und Uhrzeit.
Hier ein original Name:
FreeSpace_Bereich_der_Daten_im_Lokalen_Ordner_230520230824.xlsx
Was ich nun suche:
Eine Batch-Datei, die mir
- die ersten 10 Zeichen löscht (FreeSpace_)
- die Zahlen löscht (Der Name kann keine Zahlen enthalten, diese ausschließlich hinten) - es geht auch nicht zu sagen: lösche die letzten 13 Zeichen, denn wenn es eine 0 ist, sind es nur 12, Doppel-Null 11)
Es soll also folgendes herauskommen: Bereich_der_Daten_im_Lokalen_Ordner.xlsx
Habt ihr da vielleicht einen Code für mich :)
2 Antworten
HoiZusammen s Batch kann nicht funktionieren🥱
Batch kann nur schlecht mit unbekannten Zeichenketten umgegehen. Ich mache mir garnicht mehr die Mühe mich mit dem alten bockigen "Vieh" herumzuschlagen und Benutze Powershell.
demo.ps1
$BasePath='c:\Name\DeinesOrdners' #hier Dein Ordnername
$FileMask='FreeSpace_*.xlsx'
Get-ChildItem $BasePath -File -Filter $FileMask|
ForEach-Object {
#entferne "Freespace_" am Anfang und jede beliebige Zahlenfolge am Ende des Namens
$NewBaseName=$_.Basename -replace '^FreeSpace_' -replace '_\d+$'
$MyNewName=$NewBaseName + $_.Extension #Neuen Namen zusamenbauen
#falls bereits eine gleichnamige Datei existiert eine (Nummer) an den Namen hängen
$count=1
while (Test-Path $MyNewName){
$count++
$TempBaseName="$NewBaseName($count)"
$MyNewName=$TempBaseName + $_.Extension
}
Write-Host "$($_.FullName) => $MyNewName"
Rename-Item -Path $_.FullName -NewName $MyNewName #aktuelle Datei umbenennen
}
pause
Ein paar Worte zu de in -replace verwendeten RegEx.
- ^FreeSpace_ = am Zeilenanfang,Zeichenfolge
- _\d+$ = unterstrich,ein oder mehr Ziffern, am Zeilenende
...werden durch nichts ersetzt.
(.ps1-Scripte startet man mit Rechtsklick ...mit Powershell ausführen)
für Regex keine besondere Hürde:
https://www.regexe.de/hilfe.jsp
'_.[^_]+$'
- Unterstrich , gefolgt von beliebigen Zeichen(.), gefolgt von keinem Unterstrich, am Ende der Zeile
...etwas Umständlich, aber bei beliebigen Zeichen erforderlich da .+ extrem gefräsig ist und sich nach dem ersten Auftreten _belibigesZeichen nicht mehr interessiert was sonst noch kommt (ein Punkt matched immer)
also lieber nicht...🤔
'_[0-9a-z\-]+$'
- Unterstrich , gefolgt von den in der []-Klammer(Zeichenklasse) angegebenen Zeichen , am Ende der Zeile (aufpassen, gesuchte Text-Zeichen "-.\[](){} usw. " müssen mit einem Backslash\ maskiert werden. aus einem - wird \- )
- also Unterstrich , gefolgt ein oder mehr von Ziffern und Buchstaben , am Ende der Zeile
...ist noch immer eine grobe Keule... Du kannst dich aber auch etwas feinfühliger auf die Zeichen beschränken, welche tatsächlich auftreten könnten:
'_[0-9fuek\-]+$'
- die definierte Zeichenklasse [0-9uek\-] mached nur auf die Zeichen 0123456789uek und Minus
...da der Unterstrich nicht in dieser Klasse vorkommt bleiben alle Zeichen vor dem Letzten Unterstrich unangetastet (simpel 😎)
entsprechen sähe die relevante Zeile so aus:
$NewBaseName=$_.Basename -replace '^FreeSpace_' -replace '_[0-9efku\-]+$'
Die aufgeführten - replace arbeiten nacheinander. wenn dein baseName so aussähe :FreeSpace_Bereich_der_Daten_im_Lokalen_Ordner_f06052023e1227_230520230829 , würde nu der letzte _ und die Ziffern entfernt. es bliebe :Bereich_der_Daten_im_Lokalen_Ordner_f06052023e122 ... also must d einen Weiteren -replace für dass was übrig ist einfügen:
$NewBaseName=$_.Basename -replace '^FreeSpace_' -replace '_[\d+]+$' -replace '_[0-9efku\-]+$'
du brauchst zum probieren nicht unbedingt eine .ps1-Datei zu schreiben brobiere doch einfach in der PowerShellconsole wie die Operationen auf eine String wirken:
'blah_und_blubb_f06052023e1227_230520230829' -replace '_\d+$'
'123blah456_und_blubb_f06052023e1227fuck' -replace '_[0-9a-z\-]+$'
'123blah456_und_blubb_f06052023e1227fuck' -replace '_[0-9efuk-z\-]+$'
'123blah456_und_blubb_f06052023e1227_230520230829' -replace '_\d+$' -replace '_[0-9efuk-z\-]+$'
im resultat dürfte das folgende für deine Dateien funktionieren
Get-ChildItem $BasePath -File -Filter $FileMask|
ForEach-Object {
$NewBaseName=$_.Basename -replace '^FreeSpace_' -replace '_\d+$' -replace '_[0-9fuek\-]+$'
$MyNewName=$NewBaseName + $_.Extension
$count=1
while (Test-Path $MyNewName){
$count++
$TempBaseName="$NewBaseName($count)"
$MyNewName=$TempBaseName + $_.Extension
}
Write-Host "$($_.FullName) => $MyNewName"
Rename-Item -Path $_.FullName -NewName $MyNewName
}
...sei Dir zugestanden...😁
Der Umgang mit RegEx bringt zuweilen auch Profis an den Rand des Wahnsinns.
...aber mit etwas Übung fällt irgendwann der Groschen.
Wen man erstmal kappiert hat, wofür die einzelnen Zeichen im Suchausdruck stehen ist RegEx ein Segen. ...vor allem...Es spielt keine Rolle welche Programmiersprache man verwendet, es funktioniert immer in gleicher Weise.
Hab schon Jahre nix mehr mit Bacht gemacht. Versuche mal das hier .
@echo off
setlocal enabledelayedexpansion
set "folder=C:\Pfad\Ordner"
set "counter=1"
for %%F in ("%folder%\FreeSpace_*") do (
set "filename=%%~nxF"
set "newname=!filename:~10,-13!.xlsx"
:check_duplicate
if exist "%folder%\!newname!_!counter!.xlsx" (
set /a "counter+=1"
goto :check_duplicate
)
set "newname=!newname!_!counter!.xlsx"
echo Umbenennung: "%%F" --> "!newname!"
ren "%%F" "!newname!"
set /a "counter+=1"
)
endlocal
goto und :Label funktionieren nicht innerhalb eines Klammerblocks , deshalb auch nicht die Nummerierung, wie Du sie Dir vorgestellt hast.
Nummerierte Dateien entstehen lediglich, weil die Zeile
echo Umbenennung: "%%F" --> "!newname!"
in den neuen Dateinamen umgeleitet wird! solch unüberlegte Umleitungen können zum Datenverlust führen .
Wenn ihr schon was "lange nicht gemacht" habt, probiert es aus, bevor ihr es rausgebt...
Die Fragesteller haben noch weniger Ahnung... und verlassen sich darauf, unsereins weiß was er tut...
Diese Rüge muss ich mir gefallen lassen. Danke für den Hinweis. 😅 Als ich den Schnipsel gestern schrieb, war ich mit dem Ipad zu werke und konnte den Code nicht testen.
Hi Erzese, da hätte ich natürlich lange nach Batch im Internet suchen können. Vielen Dank. Hat soweit auch gut funktioniert. Aber nun sind ein paar Daten übrig geblieben. Diese haben am Ende nicht reine Zahlen, sondern auch noch irgendwelche sinnfreien Buchstaben und Zeichen: f06052023e1227u oder u15052023-1124kk
Ich habe keine Ahnung warum...was mir aber aufgefallen ist, es gibt keine weiteren Unterstriche mehr. Hättest du hier eine Idee, wie man trotzdem den letzten Teil löschen kann? Vielleicht sowas wie: suche von rechts das letzte "_" und lösche alles bis und inkl. diesem.