举例来说,如果提供的字符串是文件夹,则此 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-Path
cmdlet 及其-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]$ToTest
2 而是 - 这样,只有在调用脚本时指定路径,脚本才会起作用。
以上所有内容均已使用 PowerShell 版本 2 至 5.1 进行测试。
1 Get-Help Test-Path -detailed
将离线显示相同信息。
2 Get-Help about_functions_advanced_parameters
将离线显示相同信息。
答案2
如何在 powershell 中测试字符串是文件夹还是文件?
使用
Get-Item
cmdlet 获取路径所代表的对象。然后使用–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