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
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.
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
0 commenti