Come monitorare una cartella Windows per nuovi file e agire

Contenuti

I file sono in un costante stato di cambiamento su qualsiasi sistema operativo. A volte vengono creati, a volte vengono rimossi, a volte cambiano, e tutte queste sono cose normali che un sistema operativo dovrebbe fare. Qualche volta, quando un file viene modificato, può causare instabilità in un'altra applicazione che dipende da essa, come modificare un numero di porta in un file delle proprietà, un parametro in un manifest di distribuzione o addirittura correggere il codice in produzione senza passare attraverso il controllo del codice sorgente.

Come parte dell'amministrazione di questi sistemi operativi, gli ingegneri hanno bisogno di un modo per osservare cosa succede a questi file critici e agire quando succede qualcosa. Entra nel .NET Clase FileSystemWatcher e PowerShell.

In .NET e .NET Core, FileSystemWatcher è una classe che vive nel System.IO spazio dei nomi e file di monitoraggio. Un PowerShell, questo può essere molto utile, soprattutto se combinato con altre funzioni di PowerShell.

Istanziazione di FileSystemWatcher

Crea un'istanza di questa classe in PowerShell eseguendo $watcher = New-Object System.IO.FileSystemWatcher. una volta che lo faccio, dovresti dirgli quale cartella guardare. Puoi farlo impostando il Il percorso nell'oggetto FileSystemWatcher al percorso della cartella che si desidera visualizzare. Se hai una cartella in Windows chiamata GuardaQuestaCartella sotto C:, dovresti impostare FileSystemWatcher su quello eseguendo $watcher.Path="C:WatchThisFolder".

Perché questa classe è anche in .NET Core, puoi fare tutto questo su un sistema Linux o Mac OS come faresti su un sistema Windows. Come esempio, se avessi una cartella su Ubuntu Linux chiamata GuardaQuestaCartella sotto la tua directory utente corrente, dovrebbe funzionare $watcher.Path="/home/ubuntu/WatchThisFolder".

Il resto degli esempi di codice in questo post funziona su qualsiasi piattaforma senza alcuna modifica..

Attivazione dell'evento da FileSystemWatcher

Ora che hai un nuovo oggetto FileSystemWatcher, puoi dare un'occhiata sotto il cofano e provare a scoprirlo. Per visualizzare i tipi specifici di eventi del file system che FileSystemWatcher sta osservando, accedere $watcher | Get-Member -MemberType Event. Ottieni membro mostra tutto ciò che è contenuto nell'oggetto che gli è successo e, quando si aggiunge il filtro MemberType, può vedere una certa categoria, in questa circostanza, eventi.

Questi eventi sono:

  • Modificare
  • Creato
  • RIMOSSO
  • Disposto
  • Errore
  • Rinomato

Quando uno o più di questi eventi FileSystemWatcher viene rilevato nel percorso per il quale l'oggetto è configurato per l'osservazione, l'oggetto che osserva genera un evento esterno, per cui è possibile impostare azioni.

Ora che l'oggetto osservatore sa cosa guardare e sai quali eventi sta osservando, è necessario configurarlo per generare un evento quando viene rilevata un'azione. Fai questo correndo $watcher.EnableRaisingEvents = $true. Pensa a questa bandiera come a un interruttore di alimentazione / via per $watcher : Se l'interruttore è spento, non succederà nulla se vengono apportate modifiche. Inoltre puoi dirgli di guardare i file e le cartelle nidificati sotto il set nel percorso cambiando il Includi sottodirectory la bandiera su true nello stesso modo in cui hai fatto tu EnableRaisingEvents bandiera.

Definizione delle azioni da intraprendere

Una volta configurato l'oggetto osservatore, devi dargli un'azione da intraprendere una volta che viene rilevata la modifica. Questo può essere semplice come scrivere in un registro di sistema, o drastico come l'attivazione di una sostituzione dell'istanza con un'estrazione pulita del codice sorgente. Iniziare, devi impostare un blocco di azione nel codice. Eccone uno che scrive solo alla console:

$azione = {
    $path = $event.SourceEventArgs.FullPath
    $name = $event.SourceEventArgs.Name
    $changetype = $event.SourceEventArgs.ChangeType
    Write-Host "Il $name del file nel percorso $path è stato $changetype in $(get-date)"
}

È possibile vedere che questo codice sta estraendo variabili dall'evento utilizzando il comando $event variabile, che viene creato automaticamente quando l'oggetto osservatore crea l'evento. Non appena l'evento termina, Anche la variabile termina, il che significa che avrai solo i dati rilevanti per quell'evento.

Utilizzo di Register-ObjectEvent

Quindi, hai impostato FileSystemWatcher e hai azioni che vuoi intraprendere ogni volta che succede qualcosa. A quest'ora, questi due sono separati e non si conoscono. In modo che lavorino insieme, deve registrare le azioni con l'evento. PowerShell ha un cmdlet completo per questo: il Register-ObjectEvent cmdlet. Per utilizzare Register-ObjectEvent, tre cose devono succedergli:

  • L'oggetto FileSystemWatcher
  • Il tipo di evento su cui attivare le azioni
  • Le azioni che hai definito in precedenza

Se hai configurato tutto come precedentemente elencato, sarà simile a questo: Register-ObjectEvent $watcher 'Event Action' -Action $action. "Azione evento"’ può essere sovrascritto con qualsiasi evento da FileSystemWatcher, ma questa sarà una bella dimostrazione.

Testandolo

Ora puoi provare di tutto. In questa sezione, creerà un nuovo file nella directory specificata, vedrai l'azione dell'evento, successivamente disabilitare e annullare la registrazione dell'evento.

Per creare un nuovo file e attivare l'evento, esegui la riga successiva in PowerShell. Questo è su Ubuntu Linux, ma se lo stai seguendo su Windows, sostituire / inizio / ubuntu / insieme a C: e / insieme a .

New-Item -Path "/home/ubuntu/WatchThisFolder/newFile" -File ItemType

Appena lo inserisco, l'evento si accende e l'azione si accende.

Il file newFile nel percorso /home/ubuntu/WatchThisFolder/newFile è stato creato in 09/26/2019 20:49:54

Si attiva ogni volta che crei un nuovo file in quella directory o qualsiasi cosa annidata al di sotto di esso, se hai abilitato il Includi sottodirectory bandiera. Ora che sai che l'incremento dell'evento funziona, spegnilo correndo $watcher.EnableRaisingEvents = $false, poi prova a creare un nuovo file. Il file dovrebbe essere creato, ma non viene visualizzato nessun evento. Questo può essere molto utile se stai eseguendo il debug e non vuoi attivare nulla mentre lavori sul file system.

Una volta che ho finito, correre Get-EventSubscriber | Unregister-Event per annullare la registrazione dell'evento dall'azione. Ora, anche se il flag EnableRaisingEvents è vero e l'azione si verifica, l'azione non si attiverà.

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.