Come Scrivere il Tuo Primo Script PowerShell: Automazione della Pulizia dei File

Una delle metodologie di codifica più importanti da seguire è assicurarsi di conoscere e gestire ogni modo in cui il tuo codice può “fluire”. Se pensi al tuo codice come a un flusso, può diramarsi, tornare a vari punti e incontrare molte condizioni.

La gestione degli errori garantisce che tu imposti “reti” o un luogo predefinito in cui il tuo codice può fluire quando succede qualcosa di inaspettato.

Utilizziamo uno scenario del mondo reale in cui potresti trovarti, affrontando la gestione degli errori in PowerShell.

Costruzione dello Script Iniziale per la Pulizia dei File

Abbiamo bisogno di pulire alcuni file vecchi. Il nostro server di file esiste da sempre e dobbiamo liberare un po’ di spazio. La direzione ha deciso di rimuovere tutti i file più vecchi di un certo numero di giorni. Dobbiamo costruire uno script che cerca ricorsivamente in una cartella, trova tutti i file più vecchi di un certo numero di giorni e li rimuove.

Il compito sembra abbastanza facile, ma questa è la sezione della gestione degli errori, quindi sai che alcune cose andranno male!

Iniziamo a comprendere la gestione degli errori costruendo prima lo script dimostrativo dello scenario senza gestione degli errori per dimostrare il problema che la gestione degli errori risolve.

  1. Innanzitutto, apri una nuova scheda di VS Code.

    Poiché stiamo solo provando alcune cose ora, non salveremo ancora lo script. Dì temporaneamente a VS Code che stai per scrivere del PowerShell.

    Premi Ctrl-Shift-P, digita ‘lang’, seleziona Scegli Modalità Linguaggio, digita ‘power’ e scegli PowerShell. Ora VS Code sa che scriverai del PowerShell.

  2. Successivamente, suddividi il problema in compiti, risolvendo prima quello più ovvio.

    In questo caso, il compito consiste nel trovare un comando per leggere i file in una directory.

    Get-ChildItem -Path C:\OldForgottenFolder
    
  3. Get-ChildItem restituisce anche directory di cui non abbiamo bisogno, quindi limitiamo il risultato solo ai file.

    Get-ChildItem -Path C:\OldForgottenFolder -File
    
  4. Se ci sono file in quelle sottodirectory, dobbiamo recuperarli anche con Recurse.

    Get-ChildItem -Path C:\OldForgottenFolder -File -Recurse
    
  5. Ora che abbiamo il comando e i parametri, sta restituendo TUTTI i file. Dobbiamo solo trovare quelli più vecchi di un certo numero di giorni.

    Poiché Get-ChildItem restituisce ogni file con una proprietà oggetto LastWriteTime, dobbiamo filtrare su quella proprietà. Useremo il filtro Where per trovare i file con un LastWriteTime inferiore a una data specificata.

    (Get-ChildItem -Path C:\OldForgottenFolder -File -Recurse).Where{$_.LastWriteTime -le ?????}
    
  6. La data deve essere dinamica perché “vecchio” oggi sarà diverso da “vecchio” domani.

    Commenta la riga precedente perché ne avremo bisogno a un certo punto e poi risolviamo la situazione della data.

    ## (Get-ChildItem -Path C:\\OldForgottenFolder -File -Recurse).Where{$_.LastWriteTime -le ?????}
    $Now = Get-Date
    $Now
    
  7. Ora che abbiamo la data di oggi, troviamo un numero specifico di giorni prima di oggi per ottenere la data. Metterò semplicemente 30 qui temporaneamente poiché so che alcuni file hanno più di cinque giorni per fare un test rudimentale.

    ## (Get-ChildItem -Path C:\\OldForgottenFolder -File -Recurse).Where{$_.LastWriteTime -le ?????}
    $Now = Get-Date
    $LastWrite = $Now.AddDays(-30)
    $LastWrite
    
  8. Fatto! Mettiamo insieme finora.

    $Now = Get-Date
    $LastWrite = $Now.AddDays(-30)
    (Get-ChildItem -Path C:\OldForgottenFolder -File -Recurse).Where{$_.LastWriteTime -le $LastWrite}
    

    Ora abbiamo un piccolo script che trova tutti i file in una directory che sono più vecchi di un numero specifico di giorni.

  9. Successivamente, dobbiamo aggiungere la possibilità di rimuovere quei file più vecchi. Questo è banale usando il cmdlet Remove-Item e la pipeline.

    $Now = Get-Date
    $LastWrite = $Now.AddDays(-30)
    (Get-ChildItem -Path C:\OldForgottenFolder -File -Recurse).Where{$_.LastWriteTime -le $LastWrite} | Remove-Item
    
  10. Fatto! Ma aspetta, non ho idea di quali file siano stati rimossi. Ci sono stati anche alcuni errori di cui ci occuperemo tra qualche minuto. Aggiungiamo un po’ di funzionalità di base.

    $VerbosePreference = 'Continua'
    
    $Now = Get-Date
    $LastWrite = $Now.AddDays(-30)
    $oldFiles = (Get-ChildItem -Path C:\OldForgottenFolder -File -Recurse).Where{$_.LastWriteTime -le $LastWrite}
    foreach ($file in $oldFiles) {
        Remove-Item -Path $file.FullName
        Write-Verbose -Message "Rimosso con successo [$($file.FullName)]."
    }
    
  11. Dovrai includere un ciclo come questo per eseguire un certo tipo di codice per ogni file. Qui non stiamo usando la pipeline e invece stiamo mettendo tutti i file trovati in una variabile oldFiles, un array di oggetti file. Poi eseguiamo Remove-Item su ciascuno come prima, ma questa volta includendo un messaggio dettagliato che ci dice quale file sta per essere rimosso.

  12. Ora eseguiamo questo codice e vediamo cosa succede.

    Puoi ora vedere attraverso il messaggio dettagliato che sono stati rimossi alcuni file. Il codice che abbiamo ora è il cuore di cui abbiamo bisogno per creare lo script. Creiamo ora un vero script da questo nella sezione successiva.

Massimizzare flessibilità e riutilizzabilità con parametri

Hai costruito il tuo script, ma ha ancora il potenziale per essere flessibile e riutilizzabile. Come? I parametri ci permetteranno di specificare la directory e l’età dei file che vogliamo targetizzare, rendendo lo script più flessibile.

  1. Prima di andare oltre, salviamo il nostro lavoro. Chiamalo Remove-FileOlderThan.ps1.

    Nota il formato verbo/sostantivo con un trattino. Se possibile, cerca di creare sempre nomi di script nello stesso modo dei comandi PowerShell per coerenza e leggibilità.

  2. Innanzitutto, gli script sono progettati per essere riutilizzabili. È probabile che tu voglia utilizzare questo script su directory diverse e con età diverse. Dobbiamo introdurre alcuni parametri. Per fare ciò, dobbiamo capire cosa cambierà. La directory e il numero di giorni. Capito.

    param (
        [Parameter(Mandatory)]
        [string]$FolderPath,
    [Parameter(Mandatory)]
    [int]$DaysOld
    

    )

    $Now = Get-Date
    $LastWrite = $Now.AddDays(-30)
    $oldFiles = (Get-ChildItem -Path C:\OldForgottenFolder -File -Recurse).Where{$_.LastWriteTime -le $LastWrite}
    foreach ($file in $oldFiles) {
    Remove-Item -Path $file.FullName
    Write-Verbose -Message "Rimosso con successo [$($file.FullName)]."
    }

    Aggiungi un param block in cima e definisci ogni parametro come obbligatorio dato che dobbiamo avere un percorso e un numero affinché lo script funzioni. Inoltre, specifica il tipo qui come migliore pratica.

  3. Sostituisci gli elementi statici che avevamo nel codice prima con i valori dei parametri.

    param (
        [Parameter(Mandatory)]
        [string]$FolderPath,
    [Parameter(Mandatory)]
    [int]$DaysOld
    

    )

    $Now = Get-Date
    $LastWrite = $Now.AddDays(-$DaysOld)
    $oldFiles = (Get-ChildItem -Path $FolderPath -File -Recurse).Where{$_.LastWriteTime -le $LastWrite}
    foreach ($file in $oldFiles) {
    Remove-Item -Path $file.FullName
    Write-Verbose -Message "Rimosso con successo [$($file.FullName)]."
    }

  4. Ora eseguiamo lo script e vediamo cosa succede.

    C:\Scripts\Remove-FileOlderThan.ps1 -FolderPath C:\OldForgottenFolder -DaysOld 30 -Verbose
    

    Puoi vedere come dobbiamo specificare il percorso della cartella e il numero di giorni come parametri. Usa il parametro Verbose per vedere quella riga Write-Verbose.

    PowerShell ha eseguito lo script esattamente come prima, ma ora abbiamo uno script parametrico che possiamo usare su qualsiasi directory o su file di qualsiasi età!

    Dando un’occhiata all’output, abbiamo trovato del testo rosso. O non hai diritti, o il file è di sola lettura. Ma su quali file ha fallito? E come puoi assicurarti che anche quei file vengano rimossi?

    Conclusione

    In questo tutorial, abbiamo costruito uno script per pulire i file vecchi da una directory, garantendo flessibilità aggiungendo parametri. Sebbene lo script funzioni come previsto, abbiamo visto che la gestione degli errori non è stata ancora affrontata, il che è cruciale quando si affrontano scenari reali.

    Man mano che procediamo, aggiungere la gestione degli errori ci permetterà di affrontare problemi, come cmdlet che generano errori o file inaccessibili, aiutandoci a evitare la terminazione dello script e fornendo informazioni dettagliate su cosa è andato storto.

    Rimanete sintonizzati per la prossima demo! PowerShell 101: Errori Terminanti, Non Terminanti e Try/Catch.

Source:
https://adamtheautomator.com/powershell-file-cleanup-script/