Programm schreiben automatische Dateiumbenennung?
ich brauche ein kleines Programm für Win 10, welches in einem bestimmten Ordner dauerhaft nach ".dat" Dateien sucht und diese automatisch in .pdf Dateien umbenennt. Der eigentliche Name der Datei soll dabei erhalten bleiben. Kennt sich da einer aus?
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"
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.
Ich dachte bei dem Begriff an ein Programm. Es gibt auch fertige Programme, die dann z. B. etwas ausführen.
Powershell gäbe es aber auch noch
https://powershell.one/tricks/filesystem/filesystemwatcher
Du hast natürlich recht, wenn er ohnehin die Klasse einbindet, braucht man keine Batchdatei und Co.
Finde ich eine gute Idee. Könnte man dann per Batch-File lösen.
https://mspoweruser.com/batch-rename-files-extensions-windows-10/