Что такое PowerShell эквивалентно Bourne / Bash -d и -f при проверке, является ли строка папкой или файлом?

2

Например, этот скрипт Борна выведет «свою папку», если предоставленная строка является папкой, или «ее файл», если это файл.

_test=/home/myuser

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

/home/myuserдомашняя папка для моего пользователя acct. Эквивалент Windows будетC:\Users\myuser

mrjayviper
источник
1
сопутствующая информация: если вам нужно что-то сделать со всеми файлами / каталогами внутри папки, вы можете отфильтровать их следующим образом, и вам не нужно проверять, является ли это файл или каталог gci . | ? { $_.PSisContainer }для каталогов или gci . | ? { !$_.PSisContainer }для файлов
SimonS

Ответы:

2

Вы можете использовать командлет PowerShell Test-Pathи его -PathType {Container|Leaf}параметр 1, чтобы определить, является ли путь каталогом или файлом:

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

Таким образом, аналогия с вашим скриптом bourne будет такой:

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."
}

Некоторые вещи об этом скрипте:

  • if(Test-Path -Path $ToTest -PathType Container){}является сокращенной версией if((Test-Path -Path $ToTest -PathType Container) -eq $true){}- поэтому вы также можете проверить $false(например,"This path is NOT a directory!"
  • Приведенный выше способ указания $ToTestозначает «если пользовательский ввод не указан, используйте указанное fallback-значение ( "C:\Users\myuser\FooDir" . Поэтому .\script.ps1 "D:\MyPathбудет оценивать "D:\MyPath", в то время как .\script.ps1будет оценивать запасное значение (например "C:\Users\myuser\FooDir").
    • Вы также можете использовать, [string]$ToTest = Read-Host "Please specify a path to check"если вы хотите иметь консольную подсказку для пути в качестве запасного варианта ...
    • ... или полностью опустите параметр fallback-value-setting и используйте вместо него 2 - при этом сценарий будет работать, только если вы укажете путь при вызове сценария.[Parameter(Mandatory=$true)][string]$ToTest

Все вышеперечисленное было протестировано с PowerShell версий от 2 до 5.1.


1 Get-Help Test-Path -detailed покажет ту же информацию в автономном режиме.

2 Get-Help about_functions_advanced_parameters покажет ту же информацию в автономном режиме.

flolilo
источник
1

Как проверить, является ли строка папкой или файлом в powershell?

Используйте Get-Itemкомандлет, чтобы получить объект, представленный путем. Затем используйте –Isоператор, чтобы увидеть, является ли [system.io.directoryinfo]объект объектом или [system.io.fileinfo]объектом.

Вот пример:

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

True

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

False

Источник PowerTip: использование PowerShell для определения пути к файлу или папке

ДэвидПостилл
источник