Batch Teil eines Dateinamens ändern

Merlin248Mrl

Newbie
Registriert
Juli 2024
Beiträge
3
Hi zusammen,

ich möchte gerne eine Batch Datei erstellen, die nur einen Teil eines Dateinamens von 2 Excel-Dateien ändert, wenn diese in einem Ordner vorhanden sind.
Ich habe versucht dies über Einträge im Internet hinzubekommen, aber ich scheitere kläglich. So wirklich Hilfe finde ich leider nicht.
Ich möchte dies auch nicht mit einem anderen Programm wie Renamer etc tun, Dies kommt leider für mich nicht in Frage.

Die Batch Datei soll folgendes tun:

Pfad: C:\Users\PaulePup\Datenbank
Datei1: "Export Aalglocke Aachen TT.MM.JJJJ.xlsx" (TT.MM.JJJJ steht hier für das Datum, dies ändert sich täglich, da die Daten täglich erstellt werden)
Datei2: "Export Aalglocke Kaan TT.MM.JJJJ.xlsx" (TT.MM.JJJJ steht hier für das Datum, dies ändert sich täglich, da die Daten täglich erstellt werden)

1. Prüfe, ob Datei1 im Pfad vorhanden ist
2. Wenn vorhanden: Ändere Dateiname von "Export Aalglocke Aachen TT.MM.JJJJ.xlsx" in "Export Final TT.MM.JJJJ" - Es soll also nur "Aalglocke Aachen" in "Final" geändert werden. Der Rest muss erhalten bleiben.
3. Prüfe, ob Datei2 im Pfad vorhanden ist
4. Wenn vorhanden: Ändere Dateiname von "Export Aalglocke Kaan TT.MM.JJJJ.xlsx" in "Export abc TT.MM.JJJJ" - Es soll also nur "Aalglocke Kaan" in "abc" geändert werden. Der Rest muss erhalten bleiben.
5. Ende

Ich hoffe so sehr, dass Ihr mir dabei helfen könntet.

Viele liebe Grüße und einen tollen Freitag wünsche ich Euch! :)
 
Man verwendet kein Batch mehr in 2024 ;)

Powershell (ungetestet, kann daher noch Fehler haben)

Code:
$basepath = 'C:\Users\PaulePup\Datenbank'

$date = Get-Date -Format "dd.MM.yyyy"


$datei1 = ('Export Aalglocke Aachen ' + $date + '.xlsx')
$datei2 = ('Export Aalglocke Kaan ' + $date + '.xlsx')


$tmpPath = Join-Path $basepath -ChildPath $datei1

if (Test-Path $tmpPath) {
Rename-Item $tmpPath -NewName ('Export Final' + $date + '.xlsx')
}

$tmpPath = Join-Path $basepath -ChildPath $datei2

if (Test-Path $tmpPath) {
Rename-Item $tmpPath -NewName ('Export abc' + $date + '.xlsx')
}

Powershell ist auf Windows in der Version 5 vorinstalliert, bei komplexeren Sachen empfehle ich die aktuelle V7 die aber nachinstalliet werden muss.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: floq0r und Mystery1988
Muss es batch sein? Geht es auch mit powershell?

Da war @pizza4ever schneller

Dein Dateformat ist nicht richtig müsste es nicht dd.MM.yyyy sein?
 
Hey pizza4ever, hey Mystery1988,

vielen Dank für Eure Tipps. Ich werde es asap testen und gebe Euch direkt Bescheid :)

lg
Ergänzung ()

Hey zusammen,

ich habe nun das Script im PS ISE erstellt und es laufen lassen. Leider passiert dabei aber gar nichts. Ich erhalte auch keinerlei Fehlermeldungen :( (Siehe Foto)

1721375553211.png
 
Zuletzt bearbeitet:
Naja, das problem wird trivial sein.

Du könntest dir mal

Code:
if (Test-Path $tmpPath) {
Rename-Item $tmpPath -NewName ('Export Final' + $date + '.xlsx')
}

wie folgt ausgeben:

Code:
echo $tmpPath
if (Test-Path $tmpPath) {
echo 'File exists'
Rename-Item $tmpPath -NewName ('Export Final' + $date + '.xlsx')
}

und schauen was schiefläuft.

du kannst übrigens die auch selber im ISE breakpoints in das skript setzen und schauen, was genau schief läuft.
 
1721378223912.png

Ich glaube der Fehler liegt im Datum. Das Script geht immer vom heutigen Datum aus. Allerdings - sorry falls ich es nicht gesagt hatte - Darf das Datum nicht relevcant sein. Es könnte jedes Datum da stehen. Es darf halt nicht mit unbenannt werden.

Als ich die Testdateien mit dem heutigen Datum versehen habe, hat alles wunderbar funktioniert. Also liegt es an der "Festlegung" dass die Datei das heutige Datum haben muss. Wie kann ich das ändern?
 
Soo, alles ungestet bzw. nur auf ps7 geschrieben, es sollte aber keine Änderungen in ps5 geben

Code:
$basepath = 'C:\Users\PaulePup\Datenbank'

[array]$dateien1 = Get-ChildItem $basepath -Filter ('Export Aalglocke Aachen *.xlsx')
[array]$dateien2 = Get-ChildItem $basepath -Filter ('Export Aalglocke Kaan *.xlsx')

foreach ($datei in $dateien1) {
   try {
       $tmp = [regex]::Match($datei.Name, 'Export Aalglocke Aachen (\d+[.]\d+[.]\d+)' )
       if ($tmp.Success) {
           $date = $tmp.Groups[1].Value
           $null = [datetime]::ParseExact($date, 'dd.MM.yyyy', $null)
           Rename-Item $datei.FullName -NewName $datei.Name.Replace('Aalglocke Aachen', 'Final')
       }
   }
   catch {
       Write-Host 'Irregular Date in Block1'
   }
}

foreach ($datei in $dateien2) {
   try {
       $tmp = [regex]::Match($datei.Name, 'Export Aalglocke Kaan (\d+[.]\d+[.]\d+)' )
       if ($tmp.Success) {
           $date = $tmp.Groups[1].Value
           $null = [datetime]::ParseExact($date, 'dd.MM.yyyy', $null)
           Rename-Item $datei.FullName -NewName $datei.Name.Replace('Aalglocke Kaan', 'abc')
       }
   }
   catch {
       Write-Host 'Irregular Date in Block2'
   }
}


Je nachdem wie genau das vorher aussieht kann man noch ein paar Zeilen weglassen oder benötigt noch mehr Exception Handling, aber grundsätzlich sollte das schon tun, was verlangt ist.
 
  • Gefällt mir
Reaktionen: s1ave77
Hallo, hier eine Batch-Lösung mit Ausgabe-Meldungen zum Vergleich. Soll keine Konkurrenz sein. :)
Es ist schon richtig, dass man heute besser gleich mit Powershell anfängt.

Code:
@echo off &setlocal

set WkDir=C:\Users\PaulePup\Datenbank
set WkF1=Export Aalglocke Aachen ??.??.????.xlsx
set WkF2=Export Aalglocke Kaan ??.??.????.xlsx

pushd "%WkDir%"

:WkF1
if /i not exist "%WkF1%" echo. & echo Datei "%WkF1%" nicht vorhanden & GOTO WkF2
FOR /F "tokens=1-3*" %%a in ('dir "%WkF1%" /A/B 2^>nul') do if /i exist "%%a %%b %%c %%d" (
ren "%%a %%b %%c %%d" "%%a Final %%d" && echo. & echo Datei "%%a %%b %%c %%d" in "%%a Final %%d" umbenannt)

:WkF2
if /i not exist "%WkF2%" echo. & echo Datei "%WkF2%" nicht vorhanden & GOTO end
FOR /F "tokens=1-3*" %%a in ('dir "%WkF2%" /A/B 2^>nul') do if /i exist "%%a %%b %%c %%d" (
ren "%%a %%b %%c %%d" "%%a abc %%d" && echo. & echo Datei "%%a %%b %%c %%d" in "%%a abc %%d" umbenannt)

:end
popd
echo.
echo mit beliebiger Taste beenden ...
pause >nul
endlocal

Gruß Somebody111
 
Zuletzt bearbeitet:
@Somebody111 Schöne zweite Lösung, ich werde allerdings in Zukunft solche Fragen hier nicht mehr beantworten. Ein neues Mitglied meldet sich hier an, fragt was und nachdem alles gelöst ist kommt kein Danke bzw. Feedback und man hört nichts mehr. Wäre selbst in einem kostenpflichtigen Auftragsverhältnis unschön, in einem Forum wo einem kostenlos geholfen wird finde ich so ein Verhalten unmöglich.

Zumal der Name der Dateien bei mir irgendwie das Gefühl beschleichen lässt, dass es sich hier um einen überforderten Admin handelt der seine Dienstleistung irgendwohin weiter verkauft,aber gut die Dateinamen können ja auch frei gewählt sein.
 
  • Gefällt mir
Reaktionen: Somebody111 und Ponderosa
@pizza4ever
Die arbeiten wohl alle nach dem "Tu niemals etwas selbst, was ein anderer für dich erledigen kann. -John Davidson Rockefeller" Prinzip.
 
  • Gefällt mir
Reaktionen: pizza4ever
Zurück
Oben