Вы можете использовать командлет 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
покажет ту же информацию в автономном режиме.
gci . | ? { $_.PSisContainer }
для каталогов илиgci . | ? { !$_.PSisContainer }
для файлов