我想写一个函数,它需要多个参数,它可以来自命令行,也可以来自管道。参数可以是字符串或目录对象。这个想法是下列任何调用的应工作:如何创建一个接受来自管道和命令行的多个参数类型的函数?
Test-VEnv '.\MyPath', '.\AnotherPath'
Test-VEnv (dir)
'MyPath', 'AnotherPath' | Test-VEnv
dir | Test-VEnv
下面的代码几乎作品:
function Test-VEnv {
[CmdletBinding()]
param (
[Parameter(Mandatory=$true, Position=0,
ValueFromPipeline=$True,
ValueFromPipelineByPropertyName=$true)]
[Alias('FullName')]
[String[]]$Path
)
process {
foreach ($P in $Path) {
...
}
}
}
它可以处理从管道和命令参数字符串,并处理目录对象从管道(通过ValueFromPipelineByPropertyName和FullName别名)。不过,这并不在命令行处理目录对象,所以
dir | Where-Object { Test-VEnv $_ }
失败,因为它转换目录对象为字符串,它使用的名称属性,而不是全名,和随后的代码失败。
谁能告诉我如何实现我想要的?
我知道,即使我能得到这个工作,它可能不是一个特别好的设计。但据我所知,这就是内置测试路径的工作原理,所以我想在创建自己的之前尝试遵循标准行为...
好的,所以你说的是我的函数的行为就像测试路径一样。我的道歉,我似乎让我的测试有点混乱 - 谢谢澄清我。那么这是否意味着不可能实现我想要的结果? (至少在代码中没有不明确的类型检查) – 2012-03-27 08:45:38
@PaulMoore无论是否使用了管道,你是否期望完整路径作为字符串绑定到'$ Path'? – 2012-03-27 09:11:11
@PaulMoore尝试使用'PsPath'这是'Test-Path'使用的。我用一些例子更新了我的答案。 – 2012-03-27 19:17:30