【问题标题】:Strong type checking for non existent file declared in a function parameter对函数参数中声明的不存在文件进行强类型检查
【发布时间】:2015-11-04 11:36:47
【问题描述】:

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

[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[System.Management.Automation.PathInfo]$PathInfo

通常我会在调用代码中使用Resolve-Path 来获取System.Management.Automation.PathInfo 类型的对象,我可以将其传递给此参数,但是在这种情况下,文件尚不存在是合法的,因此Resolve-Path 将抛出错误。

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

【问题讨论】:

  • FileInfo 呢? FileInfo 实例可以指向不存在的目录/文件 ($pathInfo = New-Object IO.FileInfo C:\non-existent.txt)
  • 卫生署!太容易了。谢谢先生。
  • @jamiet 你也可以检查文件是否存在,直接在FileInfo对象上:([System.IO.FileInfo]"C:\nonexist.ext").Exists
  • 很好,谢谢@MathiasR.Jessen

标签: powershell


【解决方案1】:

虽然在这种情况下使用[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
  )

  ....
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    相关资源
    最近更新 更多