2016-09-16 21 views
2

我正在編寫一個可以進行流水線輸入的PowerShell函數。具體來說,我正在用Import-CSV進行測試。許多參數不是強制性的,這意味着有時CSV不會有這些列。對於布爾值,它按預期工作,但對於字符串值,缺少的CSV字段會在字符串字段中生成行對象的副本。PowerShell函數參數當CSV字段不存在時會出現意外的值

下面是一個例子問題參數:

[Parameter(Mandatory=$False, 
     ValueFromPipeline=$True, 
     ValueFromPipelinebyPropertyName=$True, 
     HelpMessage="TCP Port of the remote server")] 
[Alias('Port', 'Remote Server Port')] 
[string]$RemoteServerPort = "5500", 

現在,如果該字段缺少,我期望的值是"5500"的規定,而是我得到:

$RemoteServerPort = @{Name=KG; IP=10.1.1.1; Username=Admin; Password=} 

我我做了一些四處張望,但坦率地說,我甚至不知道要搜索什麼。

回答

3

這是因爲您指定了ValueFromPipeline=$True,因此如果PoSh無法通過屬性名稱綁定參數,PoSh會將管道對象強制爲string。你可以解決由該參數移除ValueFromPipeline=$True並引入另一個被綁定到管道對象,即像這樣

function MyTestFunc() { 

    param(
     [Parameter(ValueFromPipeline=$True)] 
     [object]$PipedObj, 

     [Parameter(Mandatory=$False, 
       ValueFromPipelinebyPropertyName=$True, 
       HelpMessage="TCP Port of the remote server")] 
     [Alias('Port', 'Remote Server Port')] 
     [string]$RemoteServerPort = "5500" 
    ) 

    Write-Host "Port: $RemoteServerPort/Obj: $PipedObj" 
} 


$o1 = [pscustomobject]@{"Server" = "123"; "Port" = "12345"} 
$o2 = [pscustomobject]@{"Server" = "1234"; "OS" = "Win3.1"} 

$o1 | MyTestFunc 
$o2 | MyTestFunc 

會導致

Port: 12345/Obj: @{Server=123; Port=12345} 
Port: 5500/Obj: @{Server=1234; OS=Win3.1} 

一種方式,詳細看什麼實際上是幕後發生的事情是使用Trace-Command像這樣

Trace-Command ParameterBinding {$o2 | MyTestFunc} -PSHost 
+0

我想你建議,得到了相同的結果。 $ RemoteServerPort仍顯示對象字符串而不是「5500」。 –

+0

所以,我對ValueFromPipeline = $ True的基本上所有屬性,我現在註釋掉了,留在你建議的$ PipedObj,它似乎就像它的工作。我需要做更多的測試。你知道爲什麼會這樣嗎? –

+0

嗯,我想在這種情況下整個綁定過程是困惑 - [那裏](https://learn-powershell.net/2013/05/07/tips-on-implementing-pipeline-support/)是一篇博客文章處理管線輸入,還提到了在這種邊緣情況下發生的奇怪事情。如果有人想到它,對於與PoSh相同類型的多個參數使用'ValueFromPipeline = $ True'是沒有意義的,在這種情況下,不知道管道輸入應綁定到哪個參數 – DAXaholic

相關問題