当测试字符串是文件夹还是文件时,与 Bourne/Bash -d 和 -f 等效的 powershell 是什么?

当测试字符串是文件夹还是文件时,与 Bourne/Bash -d 和 -f 等效的 powershell 是什么?

举例来说,如果提供的字符串是文件夹,则此 Bourne 脚本将输出“its a folder”(它是一个文件夹);如果提供的字符串是文件,则输出“its a file”(它是一个文件)。

_test=/home/myuser

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

/home/myuser是我的用户帐户的主文件夹。Windows 对应文件夹将是C:\Users\myuser

答案1

您可以使用PowerShell 的Test-Pathcmdlet 及其-PathType {Container|Leaf}参数1判断路径是目录还是文件:

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

因此,与您的 bourne-script 的类比将是:

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意味着“如果没有给出用户输入,则使用指定的后备值("C:\Users\myuser\FooDir")”。因此.\script.ps1 "D:\MyPath将评估"D:\MyPath",而.\script.ps1将评估 fallback-value (例如"C:\Users\myuser\FooDir")。
    • [string]$ToTest = Read-Host "Please specify a path to check"如果您希望使用控制台提示路径作为后备,您也可以使用......
    • ...或者完全省略 fallback-value-setting 并使用 [Parameter(Mandatory=$true)][string]$ToTest2 而是 - 这样,只有在调用脚本时指定路径,脚本才会起作用。

以上所有内容均已使用 PowerShell 版本 2 至 5.1 进行测试。


1 Get-Help Test-Path -detailed将离线显示相同信息。

2 Get-Help about_functions_advanced_parameters将离线显示相同信息。

答案2

如何在 powershell 中测试字符串是文件夹还是文件?

使用Get-Itemcmdlet 获取路径所代表的对象。然后使用–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 确定路径是文件还是文件夹

相关内容