In questo piccolo articolo descrivo come usare il cmdlet Test-Path per controllare se una cartella esiste. Digita Get-Help Test-Path per informazioni integrate. Dimostro anche brevemente come usare il metodo di classe .NET Exists() dalla classe System.IO.Directory.

Tweet

Come controllare se una cartella esiste con PowerShell

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

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

Ricorda che hai bisogno di apici singoli o doppi intorno al percorso se contiene uno spazio. Le virgolette singole sono raccomandate, poiché non espandono/sostituiscono/interpolano le variabili.

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

  • Qualsiasi
  • Libera (file)
  • Contenitore (directory/cartella)
PS C:\> Test-Path C:\Windows -PathType AnyTruePS C:\> Test-Path C:\Windows -PathType ContainerTruePS C:\> Test-Path C:\Windows -PathType LeafFalse

Esempio di screenshot

Powershell-how-to-check-if-folder-exists.png

Uso dello script

In uno script, lo useresti tipicamente in un’istruzione 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 della cartella 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 della cartella, ma la scelta leggermente più sicura è quella delle virgolette singole. Questo è ciò che PowerShell fa di default quando si autocompleta i nomi con tab al prompt.

PS C:\> if ( Test-Path -Path 'C:\Windows' -PathType Container ) { "It's a container/folder/directory" }It's a container/folder/directoryPS C:\> if ( -not (Test-Path -LiteralPath 'C:\Windows' -PathType Leaf) ) { "It's not a leaf/file" }It's not a leaf/file

Si dovrebbe anche conoscere il parametro -LiteralPath a Test-Path, che si può vedere nel secondo esempio sopra. Questo funziona anche se il vostro file contiene caratteri come le parentesi che fanno sì che il parametro -Path espanda il percorso poiché supporta la sintassi jolly per impostazione predefinita. Usa -LiteralPath se non hai bisogno dell’espansione di -Path, perché è la scelta più sicura per i file con nomi strani.

Crea una directory se non esiste

Per creare una directory se non esiste, questo è un esempio molto robusto di come potresti volerlo gestire. Adattatelo alle vostre esigenze.

Questo codice è stato messo nel file “NewDirDemo.ps1” che mi vedete usare qui sotto.

Param( $DirectoryToCreate)if (-not (Test-Path -LiteralPath $DirectoryToCreate)) { try { New-Item -Path $DirectoryToCreate -ItemType Directory -ErrorAction Stop | Out-Null #-Force } catch { Write-Error -Message "Unable to create directory '$DirectoryToCreate'. Error was: $_" -ErrorAction Stop } "Successfully created directory '$DirectoryToCreate'."}else { "Directory already existed"}

Dimostrazione dell’uso nel seguente screenshot.

Crea dir se non esiste.jpg

Enumerazione dei possibili valori di PathType

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

PS C:\> Test-Path C:\Windows -PathType fooTest-Path : Cannot bind parameter 'PathType'. Cannot convert value "foo" to type"Microsoft.PowerShell.Commands.TestPathType" due to invalid enumeration values.Specify one of the following enumeration values and try again.The possible enumeration values are "Any, Container, Leaf".At line:1 char:31+ Test-Path C:\Windows -PathType <<<< foo + CategoryInfo : InvalidArgument: (:) , ParameterBindingException + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.TestPathCommand

Usando il metodo di classe .NET System.IO.Directory Class Method “Exists”

Potete anche usare il metodo Exists() della classe .NET System.IO.Directory, che richiede un percorso completo:

PS E:\temp> ::Exists('E:\temp\')TruePS E:\temp> ::Exists('E:\temp')True

Se volete controllare se la directory in cui si trova lo script/programma contiene una sottodirectory, potete usare il trucco che vi mostro qui sotto – dove controllo se esiste una sottodirectory chiamata “Windows”.

In PowerShell, lo spazio dei nomi “System” non deve essere digitato esplicitamente, quindi potete ometterlo.

PS C:\> ::Exists( (Join-Path (Get-Location) 'Windows') )TruePS C:\> cd E:\tempPS E:\temp> ::Exists( (Join-Path (Get-Location) 'Windows') )False

Categorie: Articles

0 commenti

Lascia un commento

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