Use test-path with powershell to check if a file exists

In questo piccolo articolo descrivo come usare il cmdlet Test-Path per controllare se un file esiste – così come un’alternativa .NET che un collega una volta ha dovuto usare in un contesto SCOM. Digita Get-Help Test-Path per maggiori informazioni, possibilmente con lo switch “-online”. Dimostro anche rapidamente il metodo di classe .NET Exists() dalla classe System.IO.File.

Dimostro anche come creare un nuovo file se uno non esiste attualmente e mostro come gestire i fallimenti nella creazione del file con grazia.

La documentazione ufficiale online di Microsoft è qui a questo link.

Tweet

Come controllare se un file esiste con PowerShell

Puoi usare qualcosa come questo per la verifica sulla linea di comando:

PS C:\> Test-Path C:\WindowsTrue

Siate consapevoli che avete bisogno di virgolette se il percorso contiene spazi, parentesi – e forse altri caratteri che ora non mi vengono in mente. PowerShell aggiunge automaticamente le virgolette quando si completa il tab. Raccomando di usare le virgolette singole, perché le virgolette doppie “espandono” le variabili (soprattutto se avete “$” nel percorso).

PS C:\> Test-Path -Path 'C:\Program Files'True

Altrimenti vedrai qualcosa come questo:

PS C:\> Test-Path C:\Program FilesTest-Path : A positional parameter cannot be found that accepts argument 'Files'.

Per assicurarti esplicitamente che sia un file e non una directory, usa il parametro -PathType che ha i seguenti valori possibili:

  • Qualsiasi
  • Foglia (file)
  • Contenitore (directory/cartella)

Esempio di screenshot

Uso dello script

In uno script, di solito si usa in una dichiarazione if. Per negare e controllare se la cartella o il file non esiste, usa “!” o “-not”, e ricorda di racchiudere l’istruzione Test-Path tra parentesi.

Ricorda anche che se il percorso o il nome del file contiene uno spazio, devi circondare l’intero percorso tra virgolette. Le virgolette singole o le virgolette doppie funzionano allo stesso modo se non ci sono parti “espandibili” nel percorso o nel nome del file, ma la scelta leggermente più sicura è quella delle virgolette singole. Questo è quello che PowerShell fa di default quando completi automaticamente i nomi con tab al prompt.

Dovresti anche essere consapevole della differenza tra -Path e -LiteralPath. Quest’ultimo prenderà il percorso letteralmente, come indica il nome, mentre il primo supporta la sintassi jolly. Questo viene spesso scoperto per caso quando qualcuno incontra un file con parentesi irregolari in esso, perché fa parte della stessa sintassi che usa -like, come per una cifra esadecimale. Questo causerà messaggi di errore, almeno sulle versioni precedenti di PowerShell, quando si usa -Path. Quando elencate strutture di directory da una directory principale, usate -LiteralPath. E a meno che tu non abbia bisogno del supporto per i caratteri jolly, è la scelta più sicura.

Creare un file se non esiste

Puoi usare la cmdlet Set-Content per creare un nuovo file se attualmente non esiste.

Vedi i miei esempi e Get-Help Set-Content o Microsoft Docs online qui a questo link.

Puoi anche usare Out-File e altri metodi che non mi preoccupo di elaborare qui.

Ovviamente puoi usare una $Variabile con il nome del file al posto del testo hard-coded qui.

Questo crea semplicemente un file con una stringa vuota come contenuto.

Oppure potete fare così se lavorate sulla linea di comando o se vi piace:

"" | Set-Content x:\path\filenamehere.xml

Ho pensato che sia bene dimostrare prima quello che probabilmente è considerato il modo più corretto di usare lo script.

Se volete testare i fallimenti nella creazione del file, potete usare una dichiarazione try {} catch {} con il parametro e il valore “-ErrorAction Stop” alla cmdlet che crea il file, ad es.

Ecco un rapido esempio:

Vedere è spesso credere (a volte in modo sbagliato, ma questa è un’altra storia), quindi ecco uno screen dump da PowerShell ISE che esegue questo esempio memorizzato in un file script .ps1.

Enumerazione dei possibili valori di PathType

Un piccolo “trucco” per vedere i possibili valori di enumerazione per -PathType è usarne uno che non esiste, come questo:

E notiamo la parte dove dice:

The possible enumeration values are "Any, Container, Leaf".

Using The .NET System.IO.File Class Method “Exists”

Puoi anche usare il metodo Exists() dalla classe .NET System.IO.File:

PS E:\temp> ::Exists('E:\temp\csv1.csv')True

In PowerShell, lo spazio dei nomi “System” è opzionale, quindi puoi semplicemente usare anche “Io.File”.

Una cosa di cui essere consapevoli, è che con questo metodo, hai bisogno di un percorso completo. Per controllare se un file si trova nella directory corrente con il metodo IO.File Exists(), potete usare qualcosa di simile a questo, dove normalmente usereste una variabile con il nome del file al posto del qui codificato “test.ps1”:

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *