【问题标题】:Making powershell's ParameterSet work with FileInfo and FileInfo[]使 powershell 参数集与 FileInfo 和 FileInfo[] 一起使用
【发布时间】:2015-02-10 11:21:24
【问题描述】:

我有以下代码:

Function SCCE {
[CmdletBinding()]
Param(
    [Parameter(Position=0, Mandatory=$True, ValueFromPipeLine=$True,ParameterSetName="Files")]
    [System.IO.FileInfo[]]$sourceFiles,
    [Parameter(Position=0, Mandatory=$True, ValueFromPipeLine=$True, ParameterSetName='File')]
    [System.IO.FileInfo]$sourceFile
)
PROCESS {
    Write-Host $PSCmdlet.ParameterSetName
}
}

我希望对指定的类型进行这项工作,据我所知,即使类型是准确的,它也不行。

例如:

$file = (ls)[0]
$file.getType() #FileInfo
SCCE $file

SCCE : 无法使用指定的命名解析参数集 参数。在 line:1 char:1
+ SCCE $文件
+ ~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [SCCE], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : AmbiguousParameterSet,SCCE

注释掉 sourceFiles 参数似乎解决了问题,但我不明白为什么这是模棱两可的。与第二个参数完美匹配。

我该如何解决这个问题?

【问题讨论】:

  • 您是否尝试指定默认参数集?
  • @PetSerAl 嗯,不。不过,这似乎奏效了。有没有办法解决核心问题(Powershell 正在寻找一个精确匹配的近似匹配)?
  • 由于我从未见过描述 PowerShell 参数集解析的确切行为的文档,因此指定默认参数集是我能提供的最佳选择。

标签: powershell powershell-3.0


【解决方案1】:

我不确定您为什么将它们都设置为Mandatory=$True,或者为什么您甚至为每种类型设置了一组。只需使用一个数组,如果只有一个文件要传递,它将只是一个长度为 1 的数组。

Function SCCE {
[CmdletBinding()]
Param(
    [Parameter(Position=0, Mandatory=$True,ValueFromPipeLine=$True,ParameterSetName="Files")]
    [System.IO.FileInfo[]]$sourceFiles
)
  PROCESS {
    Write-Host $PSCmdlet.ParameterSetName
  }
}

然后你可以这样调用:

> SCCE (gci . -file)
Files
> SCCE (gci . -file)[0]
Files

【讨论】:

  • 这是一个说明问题的玩具示例。实际上,这两种情况的处理方式不同。有没有办法在完全匹配的情况下防止隐式转换为数组?
  • 您为什么要这样做?大概如果你有一个数组,你会以某种方式迭代它?即使只有一个元素可以迭代,为什么不这样做呢?
  • 我想我可以做到这一点,但如果 Powershell 可用,它不去精确匹配似乎很奇怪。另一件事是基本情况实际上是一个文件(如果给定一个文件数组,它会以特定方式连接它们,然后将其传递给一个文件情况)
  • @soandos You can。您只是不能这样做 并且 使所有参数都是强制性的。 Mandatory 表示始终强制,无论位置重载如何。
猜你喜欢
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
  • 1970-01-01
相关资源
最近更新 更多