验证 $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
)