验证 $Path 参数是否存在并且是文件夹 - 空格问题
Validate $Path Parameter Exists & Is Folder - Issue with Spaces
我正在尝试验证 PowerShell 脚本路径参数。我想检查它是否存在并且它是一个文件夹。这是我的参数 setup/validation 脚本:
Param (
[Parameter(Mandatory=$true)]
[ValidateScript({
if( -Not ($_ | Test-Path) ){ throw 'Folder does not exist.' }
if( -Not ($_ | Test-Path -PathType Container) ){ throw 'The Path parameter must be a folder. File paths are not allowed.' }
return $true
})]
[String]$Path
)
用法: .\script.ps1 -Path "C:\Test Path With Space"
当 运行 在包含 space 的路径上时,验证失败:Folder does not exist.
- 我做错了什么?
- 是否有更好的方法来获取有效的文件夹路径?
注意: 我选择使用 String
参数而不是 System.IO.FileInfo
,这样我就可以确保尾随 \
路径。
可以解释您的脚本验证失败的原因是您没有用空格引用路径,这是使用 ValidateScript attribute:
上的 Write-Host $_
进行测试的一种简单方法
- 给定
script.ps1
:
param (
[Parameter(Mandatory)]
[ValidateScript({ Write-Host $_; $true })]
[String]$Path
)
正在测试不带引号的参数:
PS /> ./script.ps1 /path/with spaces
/path/with # => This is Write-Host $_
script2.ps1: A positional parameter cannot be found that accepts argument 'spaces'.
正如你所看到的,在PowerShell中,如果你想用参数绑定一个参数,并且说参数(string)有空格, the value must be enclosed in quotation marks, or the spaces must be preceded by the escape character (`
).
PS /> ./script.ps1 '/path/with spaces'
/path/with spaces
PS /> ./script.ps1 /path/with` spaces
/path/with spaces
至于如何改进路径验证,你所做的似乎很好。您可以交换条件的顺序,这样更直接:
param(
[ValidateScript({
if(Test-Path $_ -PathType Container) {
return $true
}
elseif(Test-Path $_ -PathType Leaf) {
throw 'The Path parameter must be a folder. File paths are not allowed.'
}
throw 'Invalid File Path'
})]
[string]$Path
)
我正在尝试验证 PowerShell 脚本路径参数。我想检查它是否存在并且它是一个文件夹。这是我的参数 setup/validation 脚本:
Param (
[Parameter(Mandatory=$true)]
[ValidateScript({
if( -Not ($_ | Test-Path) ){ throw 'Folder does not exist.' }
if( -Not ($_ | Test-Path -PathType Container) ){ throw 'The Path parameter must be a folder. File paths are not allowed.' }
return $true
})]
[String]$Path
)
用法: .\script.ps1 -Path "C:\Test Path With Space"
当 运行 在包含 space 的路径上时,验证失败:Folder does not exist.
- 我做错了什么?
- 是否有更好的方法来获取有效的文件夹路径?
注意: 我选择使用 String
参数而不是 System.IO.FileInfo
,这样我就可以确保尾随 \
路径。
可以解释您的脚本验证失败的原因是您没有用空格引用路径,这是使用 ValidateScript attribute:
上的Write-Host $_
进行测试的一种简单方法
- 给定
script.ps1
:
param (
[Parameter(Mandatory)]
[ValidateScript({ Write-Host $_; $true })]
[String]$Path
)
正在测试不带引号的参数:
PS /> ./script.ps1 /path/with spaces
/path/with # => This is Write-Host $_
script2.ps1: A positional parameter cannot be found that accepts argument 'spaces'.
正如你所看到的,在PowerShell中,如果你想用参数绑定一个参数,并且说参数(string)有空格, the value must be enclosed in quotation marks, or the spaces must be preceded by the escape character (`
).
PS /> ./script.ps1 '/path/with spaces'
/path/with spaces
PS /> ./script.ps1 /path/with` spaces
/path/with spaces
至于如何改进路径验证,你所做的似乎很好。您可以交换条件的顺序,这样更直接:
param(
[ValidateScript({
if(Test-Path $_ -PathType Container) {
return $true
}
elseif(Test-Path $_ -PathType Leaf) {
throw 'The Path parameter must be a folder. File paths are not allowed.'
}
throw 'Invalid File Path'
})]
[string]$Path
)