Powershell函数Params在CSV字段不存在时获取意外值

时间:2016-09-16 17:08:57

标签: powershell cmdlets

我正在编写一个可以接受管道输入的PowerShell函数。具体来说,我正在使用Import-CSV对其进行测试。许多参数不是强制性的,这意味着有时CSV不会有这些列。对于布尔值,这可以按预期工作,但是对于字符串值,缺少的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=}

我做了一些环顾四周,但坦率地说,我甚至不确定要搜索什么。

1 个答案:

答案 0 :(得分:3)

这是因为您指定了ValueFromPipeline=$True,以便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