Gli script di automazione, talvolta, possono diventare complessi. Talmente complessi che la sensazione che qualcosa possa andare storto in uno script provoca nell'autore una sensazione di stress molto caratteristica, che riprende vita ad ogni esecuzione pianificata : "E se avessi sbagliato quell'espressione regolare?" - pensa il sistemista - "Se fosse sbagliata eliminerei l'intera mailbox dell'amministratore delegato, anzichè le mail contrassegnate come spam...".
Naturalmente, prevenire è meglio che curare e Windows PowerShell mette a disposizione un meccanismo di verifica e simulazione dei comandi, utilissimo in scenari da incubo come quello sopra citato.
Poniamo, ad esempio, che sia nostro desiderio creare uno script in grado di rinominare tutti i file di una determinata cartella, anteponendo al nome un prefisso "Old_" nel caso in cui il nome originale soddisfi la wildcard "2008*.log".
Probabilmente, potremmo iniziare scrivendo uno script simile a quello che segue:
Get-ChildItem LogFolder\2008*.log |
Rename-Item -NewName { $_.Name -Replace ".*", "Old_$&" }
Una volta eseguito lo script, però, ci sorprenderà amaramente il fatto di aver rinominato in maniera errata i nostri file. L'errore è subdolo ma determinante: chi lo scoverà prima di aver letto il resto di questo snippet potrà pubblicamente bearsi nel nostro forum facendo riferimento diretto a questa pagina...
Lo script precedente contiene, ahimè, un errore. Tutti i file rinominati, infatti, conterranno la stringa "Old_" in due posizioni differenti all'interno di ciascun nome: come prefisso - e questo era il risultato sperato - e come suffisso. Il file 2008-09-01.log, ad esempio, sarà rinominato come Old_2008-09-01.logOld_: non è proprio ciò che volevamo ottenere, vero?
Per risolvere questo ed altri problemi simili, PowerShell mette a nostra disposizione due switch, in dotazione della maggior parte dei cmdlet: -WhatIf e -Confirm.
Lo switch -WhatIf permette di visualizzare a video il risultato di una determinata operazione evitando di effettuarla. Funge un po' da cintura di sicurezza per i nostri script e permette di testare script complessi che potrebbero causare danni in completa sicurezza.
Ecco come ci saremmo potuti accorgere del problema con lo script precedente, semplicemente aggiungendo -WhatIf al cmdlet Rename-Item:
Get-ChildItem LogFolder\2008*.log |
Rename-Item -NewName { $_.Name -Replace ".*", "Old_$&" } -WhatIf
In questo caso avremmo potuto prevenire il problema e capire che l'errore stava all'interno dell'espressione regolare utilizzata con -Replace (.*): effettuava il match con il nome del file due volte, sia con il contenuto vero e proprio della stringa sia con il suo valore nullo. Espressioni corrette sarebbero potute essere, invece: ^.* oppure .{1,}
Lo switch -Confirm obbliga il cmdlet a cui viene applicato a richiedere conferma ad ogni operazione effettuata. Anche utilizzando questo switch ci saremmo accorti del problema con lo script precedente:
Get-ChildItem LogFolder\2008*.log |
Rename-Item -NewName { $_.Name -Replace ".*", "Old_$&" } -Confirm
PowerShell, infatti, avrebbe visualizzato a video le stesse informazioni disponibili utilizzando -WhatIf e ci avrebbe successivamente chiesto se proseguire con l'operazione o meno.
La prossima volta che percepirete l'ansia da script non lasciatevi sopraffare: dalla vostra parte avete -WhatIf e -Confirm.