我想寫一個函數,它需要多個參數,它可以來自命令行,也可以來自管道。參數可以是字符串或目錄對象。這個想法是下列任何調用的應工作:如何創建一個接受來自管道和命令行的多個參數類型的函數?
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