PowerShell Test-Path Cmdlet: Verifica File, Chiavi e Altro Ancora

Se hai bisogno di convalidare un percorso verso un file, una chiave del registro, un certificato o qualsiasi altro percorso di unità PowerShell, devi utilizzare il cmdlet Test-Path.

Il cmdlet Test-Path è un modo semplice ma utile per verificare rapidamente molte proprietà di un file e di altri elementi. Può verificare se un file esiste (o altri tipi di elementi), se una stringa è nel formato di percorso corretto, o anche se un elemento è più recente o più vecchio di un determinato momento.

In questo tutorial, imparerai tutto sul cmdlet Test-Path di PowerShell e come puoi utilizzarlo per migliorare i tuoi script di PowerShell.

Prerequisiti

Se desideri seguire gli esempi di questo tutorial, avrai bisogno di una cosa: PowerShell. Più precisamente, il tutorial utilizzerà PowerShell v7.03 su Windows 10, anche se molte delle tecniche che imparerai si applicheranno anche alle versioni precedenti.

Cosa fa il cmdlet Test-Path?

Il cmdlet Test-Path di PowerShell è uno dei comandi più semplici. È un comando che è presente in PowerShell fin dall’inizio e restituisce solo due valori: Vero o Falso.

Ma non lasciarti ingannare dalla semplicità; ti farà risparmiare così tanto tempo nella convalida delle informazioni nei tuoi script di PowerShell.

Pensa al cmdlet Test-Path di PowerShell come controllo di qualità quando si lavora con provider e unità di PowerShell. Quando si scrive uno script, si lavorerà comunemente con vari elementi contenuti nelle unità di PowerShell. Le unità di PowerShell come C:\, HKLM, Cert, e così via.

Test-Path non funziona con tutte le unità di PS. Ad esempio, se si tenta di utilizzare Test-Path su una chiave di registro, funzionerà. Se si tenta di utilizzare Test-Path su un valore di registro, restituirà False ogni volta.

Se sei curioso, esegui subito il cmdlet Get-PSDrive in PowerShell e osserva tutte le unità di PS che compaiono per te.

PS Drives after running Get-PSDrive

Tutte queste unità hanno percorsi al loro interno come C:\Windows, HKLM:\Software, ecc. Quando si lavora con i percorsi all’interno degli script di PowerShell, è sempre buona pratica testare prima se il percorso è valido o se esiste o meno. Questo è ciò che fa Test-Path di PowerShell.

Test-Path definisce una condizione che restituisce True o False a seconda che una specifica condizione sia soddisfatta (tipicamente se un file/cartella, una chiave di registro, un certificato o anche una variabile esiste o meno).

Parametri e utilizzo di Test-Path.

Come molti altri cmdlet di PowerShell, il cmdlet Test-Path ha vari parametri che ne modificano il comportamento. Ora vediamo ciascun parametro e mostriamo come funziona e quali risultati ci si può aspettare di vedere.

Path

Il parametro Path è un parametro obbligatorio che si utilizza con ogni esecuzione di Test-Path. Il parametro Path definisce il percorso del PSDrive che si desidera verificare l’esistenza.

Ad esempio, se si desidera verificare se la cartella C:\Foo esiste o meno, si fornirà il percorso appropriato al parametro Path. Quindi, a seconda che C:\Foo esista effettivamente o meno, Test-Path restituirà True o False.

PS> Test-Path -Path 'C:\Foo'
True

La stessa tecnica può essere utilizzata per qualsiasi percorso di elemento. Forse si desidera verificare se la chiave del registro HKLM:\Software\Foo esiste o meno. Basta utilizzare il percorso della chiave del registro con il parametro Path.

PS> Test-Path -Path 'HKLM:\Software\Foo'
True

Sappiate che tutte le tecniche dimostrate in questo tutorial funzioneranno con qualsiasi percorso di PowerShell.

Utilizzo di caratteri jolly

Cosa succede se non si è interessati se un percorso ha un valore letterale. Invece, si desidera solo verificare se un percorso corrisponde a un determinato modello. In tal caso, è possibile utilizzare caratteri jolly nel valore del parametro Path.

Forse si desidera verificare se la cartella C:\Foo contiene una sottocartella che inizia con Bar. In tal caso, si potrebbe utilizzare un carattere jolly.

PS> Test-Path -Path 'C:\Foo\Bar*'

Una volta eseguito il comando sopra, Test-Path verificherà l’esistenza di qualsiasi cartella che inizia con Bar e restituirà True o False a seconda che esista o meno una cartella corrispondente a tale criterio.

Gli asterischi (*) corrispondono a uno o più caratteri, ma è anche possibile utilizzare il punto interrogativo (?) per ottenere una corrispondenza più specifica e testare un singolo carattere.

Utilizzando lo scenario precedente come esempio, se la cartella C:\Foo\Bar1 esiste, è possibile testare la presenza di una sottocartella di Foo che inizia con Bar ed è esattamente di quattro caratteri utilizzando il seguente comando.

PS> Test-Path -Path 'C:\Foo\Bar?'

Se, per qualche motivo, si desidera utilizzare il parametro Path con caratteri jolly, ma si vuole corrispondere letteralmente a un carattere jolly come *, è sempre possibile eseguire l’escape dei caratteri jolly con un accent grave (`).

LiteralPath

Il parametro LiteralPath è quasi identico al parametro Path con un’eccezione: non consente caratteri jolly. Utilizzando LiteralPath, il valore del percorso verrà interpretato letteralmente.

Ad esempio, se si cerca di utilizzare un asterisco o un punto interrogativo all’interno del valore del percorso utilizzando LiteralPath, Test-Path ignorerà completamente i caratteri jolly e testerà letteralmente C:\Foo\Bar? come nell’esempio seguente.

PS> Test-Path -LiteralPath 'C:\Foo\Bar?'

Si consiglia di utilizzare LiteralPath come parametro di percorso predefinito se non è necessario utilizzare caratteri jolly per garantire che Test-Path testi il percorso previsto.

PathType

Per impostazione predefinita, quando si esegue il comando Test-Path e si fornisce un percorso, restituirà True se trova qualcosa in quel percorso. L’elemento con un percorso potrebbe essere un contenitore come una cartella, una chiave di registro, un archivio di certificati, ecc., o una figlia come un file, un valore di registro o un certificato.

È possibile forzare Test-Path a essere più dettagliato e testare specificamente un contenitore o un elemento figlio utilizzando il parametro PathType.

Test-Path utilizza il valore Any per il parametro PathType per impostazione predefinita.

Ad esempio, se esiste una cartella in C:\Foo\Bar e si sta cercando un file in quel percorso, è possibile utilizzare il parametro PathType come mostrato di seguito. Si desidera solo verificare se esiste un file chiamato C:\Foo\Bar.

PS> Test-Path -LiteralPath 'C:\Foo\Bar' -PathType Leaf

Forse invece è necessario confermare se C:\Foo\Bar è effettivamente un file. In tal caso, si verificherebbe un contenitore.

PS> Test-Path -LiteralPath 'C:\Foo\Bar' -PathType Container

Includi

Se si utilizza il parametro Path e caratteri jolly, talvolta è necessario essere più specifici. In tal caso, è necessario utilizzare i parametri Include ed Exclude.

Supponiamo di avere le seguenti cartelle:

  • C:\Foo\Bar1
  • C:\Foo\Bar2
  • C:\Foo\Bar3

Si desidera verificare se esiste una cartella che inizia con Bar che ha esattamente quattro caratteri come Bar1, Bar2, ecc.

PS> Test-Path -Path C:\Foo\Bar? -PathType Container

Il comando precedente funziona bene, ma ora si desidera trovare solo le cartelle in C:\Foo chiamate Bar2. In tal caso, è possibile utilizzare il parametro Include.

PS> Test-Path -Path C:\Foo\Bar? -PathType Container -Include 'Bar2'

Il comando sopra ora controlla solo essenzialmente una singola cartella C:\Foo\Bar2. Probabilmente sarebbe meglio usare semplicemente Test-Path -Path 'C:\Foo\Bar2' -PathType Container al suo posto.

Escludi

Il parametro Exclude funziona in modo simile al parametro Include, ma questa volta esclude i percorsi che corrispondono a una stringa.

Forse vuoi assicurarti che ci sia almeno un file all’interno della cartella C:\Foo e utilizzi il seguente comando:

PS> Test-Path -Path C:\Foo\* -PathType Leaf

Il comando sopra restituisce Vero o Falso se ci sono file in C:\Foo. Ma forse vuoi assicurarti che esistano file diversi da quelli con un’estensione di file txt. In tal caso, potresti utilizzare il parametro Exclude utilizzando un carattere jolly per escludere tutti i file con estensione txt dal controllo.

PS> Test-Path -Path C:\Foo\* -PathType Leaf -Exclude *.txt

Filtro

Secondo la documentazione di Microsoft, il parametro Filter “specifica un filtro nel formato o nel linguaggio del provider. Il valore di questo parametro qualifica come parametro Path. La sintassi del filtro, compreso l’uso dei caratteri jolly, dipende dal provider”.

Sebbene il parametro Filter debba essere utilizzato con altri cmdlet come Get-Childitem, ad esempio, è raramente, se mai, utilizzato con Test-Path. Se hai trovato un buon utilizzo per il parametro Filter, ti prego di contattarmi su Twitter all’indirizzo @adbertram.

Correlato: Ottieni-ChildItem: Elenco file, registro, certificati e altro come uno solo

NewerThan

Hai mai avuto bisogno di verificare il timestamp di un file e prendere una decisione in base a quello? Se sì, i parametri NewerThan e OlderThan risparmiano molto codice. Il parametro NewerThan verifica se il timestamp di un elemento è più recente di una data specifica.

Il parametro NewerThan accetta una stringa o un oggetto DateTime per rappresentare un timestamp da verificare. Ad esempio, per verificare se il file C:\Foo\bar.txt è stato creato dopo il 20 gennaio 2021, esegui Test-Path come mostrato di seguito.

Test-Path -LiteralPath 'C:\Foo\bar.txt' -NewerThan 'January 20, 2021'
## o
Test-Path -LiteralPath 'C:\Foo\bar.txt' -NewerThan '1/20/21'

OlderThan

Il parametro OlderThan è esattamente identico al parametro NewerThan ma opposto. Questo parametro verifica se un elemento è più vecchio di una data specifica.

Test-Path -LiteralPath 'C:\Foo\bar.txt' -OlderThan 'January 20, 2021'
## o
Test-Path -LiteralPath 'C:\Foo\bar.txt' -OlderThan '1/20/21'

IsValid

Se hai mai costruito dinamicamente un percorso in uno script, conoscerai la difficoltà. A volte potresti digitare erroneamente una chiave o inserire un carattere speciale nel percorso; se è così, il parametro IsValid è fatto per te.

Il parametro IsValid è un parametro unico che trasforma Test-Path, non in un cmdlet che verifica l’esistenza di un elemento, ma in uno che controlla la sintassi del percorso. Questo parametro conferma se un percorso è valido solo.

Ad esempio, potresti dover verificare se un percorso è sintatticamente valido. Stai lavorando con un paio di variabili e le concateni per costruire un percorso.

Quando si concatenano percorsi, utilizzare sempre il cmdlet Join-Path. Questo è solo a scopo di esempio!

$someVar = 'abc:dff'
$rootPath = 'C:\'
$path = "$someVar$rootPath

Ora, per assicurarti che il percorso che hai creato dinamicamente sia valido, utilizza il parametro IsValid come mostrato di seguito. Troverai che Test-Path restituisce False.

PS> Test-Path -LiteralPath $path -IsValid
False

Il percorso abc:dffC:\ non è un percorso valido, consentendoti di creare una routine di convalida da questa situazione.

Se stai utilizzando PowerShell v6.1.2 o una versione precedente e stai utilizzando i parametri IsValid e PathType insieme, Test-Path ignorerà il parametro PathType.

Credenziali

Anche se troverai il parametro Credential in Test-Path, potresti pensare di poterlo utilizzare per autenticarti alle unità PS come altro utente. Questa è un’assunzione valida, ma è sbagliata.

Purtroppo, il parametro Credential non fa molto con il cmdlet Test-Path. Microsoft consiglia di utilizzare il cmdlet Invoke-Command e utilizzare il parametro Credential lì se si desidera invocare Test-Path con credenziali alternative.

Invoke-Command -Credential (Get-Credential) -Scriptblock {Test-Path -LiteralPath 'C:\'}

Correlato: Invoke-Command: il modo migliore per eseguire codice remoto

Source:
https://adamtheautomator.com/powershell-test-path/