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

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

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

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

0

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

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

1