Programm schreiben automatische Dateiumbenennung?

2 Antworten

die einfachste Variante (einfach gelegendlich starten)

dem.cmd

set "MyPath=C:\testfolder"
ren "%MyPath%\*.dat" "*.pdf"

Die folgende Variante benennt einfach alle 10 Sekunden in Endlosschleife alle im Ordner vorhandenen .dat-Dateien um:

demo.cmd

@echo off
set "MyPath=C:\testfolder"
for /l %%a in (0) do (
  ren "%MyPath%\*.dat" "*.pdf"  2>nul
  timeout 10 >nul
)

...dieses Verfahren ist allerdings auf eine minimale Zeitgranularität von einer Sekunde beschränkt. (aber dafür schön billig

hier Noch einen Filsystemwatcher, welcher sofort reagiert, wenn eine .dat-Datei im Ordner erzeugt wird.

watche.ps1

$SourceFolder='.'  #ordner  der überwacht werden soll
$FileFilter='*.dat' #zu überwachende/verarbeitende  Dateien
  #erstmal alle vor dem Start des Watchers bestehenden  .dat-Dateien umbenennen.
Get-ChildItem -Path $SourceFolder -Filter $FileFilter|
    Rename-Item -Newname { $_.Name -replace '.dat','.pdf'} -Force #-whatif




$watcher=New-Object System.IO.FileSystemWatcher
$watcher.Path=$SourceFolder  #zu beobachtender Ordner 
$watcher.Filter=$FileFilter  #Dateimaske, welche Dateien beobchtet werden sollen (hier  .dat)
$watcher.IncludeSubdirectories=$false  #auch Unterverzeichnisse beobachten?
$watcher.EnableRaisingEvents=$false 


### was soll getan werden  (scriptblock variable)
$Action_atCreate={
    $changeType = $Event.SourceEventArgs.ChangeType   #welche Veränderung der Auslöser  war
    $path = $Event.SourceEventArgs.FullPath  #Rückgabe Datei, welche  das Ereignis ausgelöst  hat...
    $NewName = $Event.SourceEventArgs.Name -replace '.dat','.pdf'
    Write-Host "$path was $changetype at $(get-date)" -fo green #etwas  anzeigen
    Rename-Item -Path $path -Newname $NewName 
}

    
### registriere  Ereignisse, auf welche wie reagiert werden soll 
  #du  kannst  natürlich für jedes Ereignis auch  eine  eigene Actionvariable definieren
  #...oder einfach nur  das Ereignis  registrieren, auf welches Du reagieren möchtest
Register-ObjectEvent $watcher "Created" -Action $Action_atCreate|Out-Null
  #Reaktion auf andere Ereignisse für diese Demo deaktiviert
#Register-ObjectEvent $watcher "Changed" -Action $action|Out-Null
#Register-ObjectEvent $watcher "Deleted" -Action $action|Out-Null
#Register-ObjectEvent $watcher "Renamed" -Action $action|Out-Null


  #Endlosschleife. Welche das Script geöffnet hält, Reaktionszeit auf  ereignisse 5 sekunden
while ($true) {
    Write-Host '.' -n;  #Einen Punkt als Lebenszeichen ausgeben
    Wait-Event -Timeout 10  #alle 10 Sekunden lösen um ein Lebenszeichen zu geben 
}

# siehe  auch https://www.msxfaq.de/code/powershell/ps_und_callbackfunktion.htm

Ich denke das wäre für Deine Zwecke einfach nur "Kanonen auf Spatzen"

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

Könnte man leicht über einen FileSystemWatcher lösen.

Dieser schaut permanent in einen Ordner und löst aus, wenn eine neue Datei dazukommt und gibt einem die entsprechende Datei raus. Diese könnte man dann nehmen und entsprechend umbenennen.

Woher ich das weiß:Berufserfahrung – 💻 Zertifizierter Sr. Cloud Engineer im IT-Consulting
safur  08.05.2023, 15:25

Finde ich eine gute Idee. Könnte man dann per Batch-File lösen.

https://mspoweruser.com/batch-rename-files-extensions-windows-10/

1
Tyldu  08.05.2023, 16:24
@safur

warum dann per batch umbennen wenn man eh schon ein c# programm schreibt?

2