Powershell 函数参数中声明的不存在文件的强类型检查

Powershell 函数参数中声明的不存在文件的强类型检查,powershell,Powershell,我正在编写一个PowerShell函数,该函数对文件执行某些操作,文件的路径作为参数传递给函数。我喜欢强类型和参数验证,因此我不只是将文件路径作为System.String传递,而是将参数定义为: [Parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] [System.Management.Automation.PathInfo]$PathInfo 通常,我会在调用代码中使用Resolve Path来获取类型为System.Managem

我正在编写一个PowerShell函数,该函数对文件执行某些操作,文件的路径作为参数传递给函数。我喜欢强类型和参数验证,因此我不只是将文件路径作为
System.String
传递,而是将参数定义为:

[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[System.Management.Automation.PathInfo]$PathInfo
通常,我会在调用代码中使用
Resolve Path
来获取类型为
System.Management.Automation.PathInfo
的对象,我可以将该对象传递到此参数,但是在这种情况下,文件不存在是合法的,因此
Resolve Path
将抛出错误


是否可以为不存在的文件实例化
System.Management.Automation.PathInfo
的实例?如果是,怎么做?如果没有,您是否建议我如何将不存在的文件路径传递给函数,并且仍然进行强类型检查。

尽管在这种情况下,使用
[System.IO.FileInfo]
类型可能是最简洁的解决方案(对文件执行某些操作),但如果给您文件夹的路径,您可能会遇到问题,因为
.Exists
在这种情况下返回False。您应该使用
[System.IO.DirectoryInfo]
来代替

更一般地考虑一下,您可以使用验证脚本,特别是调用某种测试函数的脚本,例如,以下脚本应允许使用
$null
或有效的
[System.Management.Automation.PathInfo]
类型的参数

function Test-Parameter {
  param($PathInfo)

  if([System.String]::IsNullOrEmpty($PathInfo)) {
    return $true

  } elseif($PathInfo -is [System.Management.Automation.PathInfo]) {
    return $true

  } else {
    return $false
  }
}
然后,您可以使用这个
[ValidateScript({…})]
检查您的参数是否满足这些(任意)条件:

function Do-Something {
  param(
    [Parameter()]
      [ValidateScript({Test-Parameter $_})]
      $PathInfo
  )

  ....
}

那么
FileInfo
呢?
FileInfo
实例可以指向不存在的目录/文件(
$pathInfo=New Object IO.FileInfo C:\non-existence.txt
)DOH!太容易了。谢谢您,先生。@jamiet您也可以直接在
FileInfo
对象上检查文件是否存在:
([System.IO.FileInfo]“C:\noexist.ext”).exists
很好,谢谢@MathiasR.Jessen