Batch zum umbenennen von Daten in einem Ordner?

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)

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

Sven8219 
Beitragsersteller
 26.05.2023, 07:47

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.

Erzesel  26.05.2023, 10:11
@Sven8219

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
 }
Sven8219 
Beitragsersteller
 26.05.2023, 12:12
@Erzesel

Ich bin zwar jetzt total verwirrt, aber klappt :) Vielen Dank

Erzesel  26.05.2023, 12:50
@Sven8219

...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

Erzesel  26.05.2023, 07:06

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...

HoiZusammen  26.05.2023, 07:45
@Erzesel

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.