Я пытаюсь написать функцию, которая принимает несколько аргументов, которые могут поступать либо из командной строки, либо из конвейера. Аргументами могут быть строки или объекты каталога. Идея состоит в том, что любая из следующих вызовов должна работать:
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 $_ }
терпит неудачу, поскольку он преобразует объекты каталога в строки, который использует свойство Name, а не FullName, и последующий код не работает.
Может ли кто-нибудь сказать мне, как добиться того, чего я хочу?
Я знаю, что даже если я смогу заставить это работать, это может быть не очень хороший дизайн. Но насколько я могу судить, как работает встроенный тестовый путь, поэтому я хочу попробовать следовать стандартным поведением, прежде чем придумывать свои собственные...