PowerShell Dateien umbenennen, sobald sie im Ordner landen

Mr_KARR

Newbie
Registriert
Okt. 2024
Beiträge
2
Hi zusammen,
ich habe mit PowerShell noch kaum Erfahrung - daher möchte ich hier einmal nachfragen, wie ich folgende Aufgabenstellung bewerkstelligen kann:

In regelmäßigen Abständen (allerdings zu keinem festen Zeitpunkt) kommen in einen festgelegten Ordner auf einem Netzlaufwerk Dateien via FTP-Download rein.
Diese Dateien müssten in ein bestimmtes Format umbenannt werden (nur der Name, nicht der Dateityp - der passt.), wofür ich bereits eine Batchdatei vorliegen habe. Wenn diese Batchdatei händisch ausgelöst wird, klappt das auch perfekt.

Nun stellt sich mir die Frage: kann man via PowerShell (nicht via externer Software) ein Script, oder ähnliches erstellen, welches die Batchdatei auslöst, sobald Dateien in diesen Ordner reinkommen? Oder notfalls etwas, was ggf. alle 1, oder 2 Minuten den Ordner auf Inhalte checkt - und wenn was da ist, dann die Batchdatei startet?

Vielleicht gibt´s auch die Möglichkeit, die Batchdatei in das PowerShell-Script gleich mit einzubauen? Aber das wäre jetzt nicht so wild...wie gesagt: die Batchdatei funktioniert ja auch so.

Sorry, falls diese Frage zu "profan" ist...aber mir würde es schon weiterhelfen...lerne ja gerne auch dazu! :-)

Danke schon mal & VG
Mr_KARR
 
Mr_KARR schrieb:
Oder notfalls etwas, was ggf. alle 1, oder 2 Minuten den Ordner auf Inhalte checkt - und wenn was da ist, dann die Batchdatei startet?
Hast du dir mal die Windows Aufgabenplanung angeschaut?

Wenn du für die eigentliche Logik schon ein fertiges Skript hast brauchst du m.e. für die Automatisierung kein Powershell mehr.
 
  • Gefällt mir
Reaktionen: Mr_KARR
Du könntest die bereits vorhandene Batch-Datei in die Aufgabenplanung bei Windows eintragen und alle paar Minuten ausführen lassen.

Ansonsten könntest du folgendes Powershell Skript probieren, was mir ChatGPT generiert hat:
Um ein PowerShell-Skript zu schreiben, das einen Ordner überwacht und Dateien nach einem bestimmten Schema umbenennt, können wir den FileSystemWatcher verwenden. Dieser überwacht Änderungen in einem Verzeichnis und löst Ereignisse aus, sobald Dateien erstellt, geändert oder gelöscht werden.

Hier ist ein Beispielskript, das einen Ordner überwacht und Dateien, die hinzugefügt werden, nach einem vorgegebenen Schema umbenennt.

### PowerShell-Skript:

PowerShell:
# Überwachungsparameter festlegen
$PfadZumVerzeichnis = "C:\Pfad\Zu\Ordner"
$NeuesSchema = "Datei_{0:yyyy-MM-dd_HH-mm-ss}.txt"  # Beispiel für das Umbenennungsschema
$Filter = "*.*"  # Alle Dateitypen überwachen

# FileSystemWatcher-Objekt erstellen
$Watcher = New-Object System.IO.FileSystemWatcher
$Watcher.Path = $PfadZumVerzeichnis
$Watcher.Filter = $Filter
$Watcher.EnableRaisingEvents = $true
$Watcher.IncludeSubdirectories = $false

# Funktion, um Dateien nach dem gewünschten Schema umzubenennen
function DateiUmbenennen {
    param (
        [System.IO.FileSystemEventArgs]$Event
    )

    try {
        $DateiPfad = $Event.FullPath
        $DateiVerzeichnis = [System.IO.Path]::GetDirectoryName($DateiPfad)
        $DateiErweiterung = [System.IO.Path]::GetExtension($DateiPfad)
        
        # Neuen Dateinamen erstellen basierend auf dem Schema und aktuellem Datum
        $Zeitstempel = Get-Date
        $NeuerDateiName = [String]::Format($NeuesSchema, $Zeitstempel)
        $NeuerDateiPfad = Join-Path $DateiVerzeichnis $NeuerDateiName

        # Datei umbenennen
        Rename-Item -Path $DateiPfad -NewName $NeuerDateiPfad -ErrorAction Stop
        Write-Host "Datei umbenannt: $DateiPfad -> $NeuerDateiPfad"
    } catch {
        Write-Host "Fehler beim Umbenennen der Datei: $_"
    }
}

# Event-Handler für neue Dateien definieren
$OnCreated = Register-ObjectEvent $Watcher "Created" -Action {
    DateiUmbenennen $EventArgs
}

# Skript läuft in einer Endlosschleife weiter, um auf neue Dateien zu warten
Write-Host "Überwache Ordner: $PfadZumVerzeichnis"
while ($true) {
    Start-Sleep -Seconds 1
}

# Bereinigung bei Beendigung des Skripts
Unregister-Event -SourceIdentifier $OnCreated.Id
$Watcher.Dispose()

### Erklärung des Skripts:

1. Verzeichnis und Schema festlegen:
- $PfadZumVerzeichnis: Der Pfad zum überwachten Ordner.
- $NeuesSchema: Das Schema für die Umbenennung. In diesem Beispiel wird das Schema so gesetzt, dass der neue Dateiname mit dem Zeitstempel formatiert wird (Datei_yyyy-MM-dd_HH-mm-ss.txt).

2. FileSystemWatcher:
- Das FileSystemWatcher-Objekt überwacht den angegebenen Ordner auf neue Dateien.
- Das Skript registriert ein Ereignis, wenn eine neue Datei erstellt wird (Created-Ereignis).

3. Datei umbenennen:
- Sobald eine neue Datei erkannt wird, wird sie in der Funktion DateiUmbenennen nach dem vorgegebenen Schema umbenannt.

4. Endlosschleife:
- Das Skript läuft in einer Endlosschleife (while ($true)), damit der FileSystemWatcher kontinuierlich auf neue Dateien reagieren kann.

5. Bereinigung:
- Wenn das Skript manuell beendet wird, sorgt der Unregister-Event dafür, dass die Ereignisregistrierung bereinigt wird.

### Anpassen:
- Du kannst das Schema für die Umbenennung in der Variablen $NeuesSchema nach Belieben ändern. Zum Beispiel:
- "Datei_{0:yyyyMMdd_HHmmss}.ext" für Dateinamen im Stil Datei_20231001_141530.ext.
- Oder füge dynamische Inhalte hinzu, z.B. "Datei_{0:yyyy-MM-dd_HH-mm-ss}_{1}.ext".

Das Skript kann nun verwendet werden, um einen bestimmten Ordner zu überwachen und alle neuen Dateien nach deinem gewünschten Schema automatisch umzubenennen.
 
  • Gefällt mir
Reaktionen: Mr_KARR und sikarr
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Mr_KARR, tollertyp, JumpingCat und eine weitere Person
Du musst so oder so die lastwritetime und Größe tracken oder die rename Operation mit entsprechender Schleife und exception Handling machen, damit wirklich erst die Änderung passiert wenn die Datei fertig geschrieben isr.

Dir muss bewusst sein, dass ohne Support der schreibenden Applikation das alles ein ziemlicher Hack ist, weil du keine Ahnung hast was die Applikation mit der Datei macht.
Es kann funktionieren, muss aber nicht.

Wenn du keine "Echtzeit-Anforderungen" hast, dann würde ich nen at-job laufen lassen alle 2 Minuten oder so und alle Dateien mit lastwritetime älter als 2 Minuten umbenennen. Nicht zu häufig, lastwritetime wird nicht in Echtzeit aktualisiert.

Wenn du Echtzeit Anforderungen hasr, dann ist NTFS (USN) Transaction Journal dein Freund, das ist aber alles andere als trivial und ich kenne keine Software, die das einfach für dich aufbereitet
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Mr_KARR und sikarr
Hi zusammen,

erstmal vielen Dank für all eure schnellen Antworten! :-)

Ich werde das mal gemäß eurer Vorschläge ausprobieren - schauen wir mal, ob es so funktioniert, wie gedacht.
Über die Aufgabenplanung würde das "getimte" Ausführen der Batchdatei sicherlich auch funktionieren - das hatte ich auch schon bedacht. Daher ja auch als "notfalls"-Lösung von mir bezeichnet.
Mir ging´s drum, das Ganze eben vielleicht noch zeitnaher ausführen zu können - und eben möglichst automatisiert.
Die Dateien werden übrigens in der Tat erst als *.tmp angeliefert und erst nach Schreibabschluß korrekt betitelt. Das ist also bereits gewährleistet - sonst würde das ja komplett schiefgehen, bzw. gar nicht machbar sein, weil die Dateien da ja noch gesperrt sind. Und so wie ich das sehe, kann man ja im dem PowerShell-Script auch als Filter den jeweiligen Dateitypen angeben, bei welchem es überhaupt reagieren soll.

Also vielen Dank nochmal - und falls noch Fragen auftauchen, melde ich mich gerne wieder. :-)

VG
Mr_KARR
 
Also FileSystemWatcher und nur Dateien betrachten (behandeln), die eben dem erwarteten "falschen" Namensschema entsprechen (also nicht mit .tmp enden, nicht dem Zielschema entsprechen).

So lange du das noch nicht umgesetzt hast spricht ja auch nichts gegen eine regelmäßig ausgeführte Aufgabe.
 
  • Gefällt mir
Reaktionen: Mr_KARR und sikarr
Zurück
Oben