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.