qual é o powershell equivalente a Bourne / Bash -d e -f ao testar se uma string é uma pasta ou um arquivo?

2

Como exemplo, este script Bourne mostrará "its a folder" se a string fornecida for uma pasta ou "its a file" se for um arquivo.

_test=/home/myuser

if [ -d $_test ]; then
   echo "its a folder"
elif [ -f $_test ]; then
   echo "its a file"
fi

/home/myuser é a pasta inicial do meu usuário acct. O equivalente do Windows será C:\Users\myuser

    
por mrjayviper 31.10.2017 / 12:45

2 respostas

2

Você pode usar o Test-Path do PowerShell cmdlet e seu parâmetro -PathType {Container|Leaf} 1 para determinar se um caminho é um diretório ou um arquivo:

Test-Path -Path "C:\Users\myuser\FooDir" -PathType Container
# Would throw 'True' or 'False'.

A analogia para o seu roteiro de bourne seria, portanto:

param(
    [string]$ToTest = "C:\Users\myuser\FooDir"
)

if(Test-Path -Path $ToTest -PathType Container){
    Write-Output "Path is a directory."
elseif(Test-Path -Path $ToTest -PathType Leaf){
    Write-Output "Path is a file."
}else{
    Write-Output "Path is non-existent."
}

Algumas coisas sobre esse script:

  • if(Test-Path -Path $ToTest -PathType Container){} é a versão abreviada de if((Test-Path -Path $ToTest -PathType Container) -eq $true){} . Por isso, você também pode verificar por $false (por exemplo, "This path is NOT a directory!"
  • A maneira acima de especificar $ToTest significa "se nenhuma entrada do usuário for fornecida, use o valor de fallback especificado ( "C:\Users\myuser\FooDir" )" . Portanto, .\script.ps1 "D:\MyPath avaliará "D:\MyPath" , enquanto .\script.ps1 avaliará o valor de fallback (por exemplo, "C:\Users\myuser\FooDir" ).
    • Você também pode usar [string]$ToTest = Read-Host "Please specify a path to check" se quiser ter um prompt de console para o caminho como um fallback ...
    • ... ou omitir completamente a configuração do valor de fallback e usar [Parameter(Mandatory=$true)][string]$ToTest 2 em vez disso - com isso, o script só funcionará se você especificar um caminho ao chamar o script.

Todos os itens acima foram testados com as versões 2 a 5.1 do PowerShell.

1 Get-Help Test-Path -detailed mostrará as mesmas informações off-line.

2 Get-Help about_functions_advanced_parameters mostrará a mesma informação offline.

    
por 31.10.2017 / 13:13
1

Como faço para testar se uma string é uma pasta ou um arquivo no powershell?

Use the Get-Item cmdlet to get the object represented by the path. Then use the –Is operator to see if the object is a [system.io.directoryinfo] object or a [system.io.fileinfo] object.

Here is an example:

PS C:\> (Get-Item c:\fso) -is [System.IO.DirectoryInfo]

True

PS C:\> (Get-Item C:\fso\csidl.txt) -is [System.IO.DirectoryInfo]

False

Origem Dica: Usando o PowerShell para determinar se o caminho é para o arquivo ou a pasta

    
por 31.10.2017 / 12:50

Tags