当 CSV 字段不存在时,Powershell 函数参数获得意外值
Powershell function Params getting unexpected values when CSV fields are not present
我正在编写一个可以接受管道输入的 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=}
我环顾四周,但坦率地说,我什至不确定要搜索什么。
这是因为您指定了 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
我正在编写一个可以接受管道输入的 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=}
我环顾四周,但坦率地说,我什至不确定要搜索什么。
这是因为您指定了 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