gpt4 book ai didi

当 CSV 字段不存在时,Powershell 函数参数获取意外值

转载 作者:行者123 更新时间:2023-12-02 23:24:54 34 4
gpt4 key购买 nike

我正在编写一个可以接受管道输入的 PowerShell 函数。具体来说,我正在使用 Import-CSV 对其进行测试.许多参数不是强制性的,这意味着有时 CSV 将没有这些列。对于 bool 值,这按预期工作,但对于字符串值,缺少的 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如果它不能通过属性名绑定(bind)参数。你可以通过删除 ValueFromPipeline=$True 来解决这个问题。从这个参数并引入另一个绑定(bind)到管道对象,即类似这样的东西

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

关于当 CSV 字段不存在时,Powershell 函数参数获取意外值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39536800/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com