【问题标题】:ValueFromPipelineByPropertyName and type conversionValueFromPipelineByPropertyName 和类型转换
【发布时间】:2015-09-29 22:33:40
【问题描述】:

假设我有这个功能:

function Get-HasFoo{
    param(
        [Parameter(
            Mandatory=$True,
            ValueFromPipeline=$True,
            ValueFromPipelineByPropertyName=$True)]
        [bool]$Foo
    )
    process {
        Write-Host "`$Foo is $Foo"
    }
}

如果我明确指定我的论点,它会起作用:

Get-HasFoo -Foo $true
$Foo is True

但是,如果值来自 CSV 导入,则不是:

$payload = ConvertFrom-Csv "Foo
True
False" 

$payload | Get-HasFoo

我收到此错误:

Get-HasFoo:无法处理参数“Foo”的参数转换。无法将值“System.String”转换为类型“System.Boolean”。布尔参数只接受 布尔值和数字,例如 $True、$False、1 或 0。

有没有办法从 csv 导入中自动转换值?

[编辑] 我的实际目标是从 CSV 文件(用 Excel 编辑)提供 PowerShell 函数。函数可以有多个参数。

[编辑]我还尝试将 csv 绑定到自定义类型:

$typeDef = "public class HasFooDef {
    public bool Foo { get; set; }
}"

Add-Type $typeDef

$payload = ConvertFrom-Csv "#TYPE HasFooDef
Foo
True
False" 

但错误仍然存​​在

【问题讨论】:

  • 你想做什么?这里 $payload 是一个 psobject,具有一个属性:foo 和 2 个值:true 和 false。这不能转换为布尔值
  • @Kayasax:不,payload 是一个自定义 PSObject 数组,具有一个属性 Foo$payload | % { $_.Foo } 输出 True\nFalse$payload -is [array] 输出 true。 Foo 属性是字符串类型,但我可以确保它只包含真或假。
  • $payload.foo.count = 2
  • @Kayasax,这是由于 powershell 的一个很好的功能,它允许将对象数组的子属性投影到仅具有此属性值的新数组

标签: powershell


【解决方案1】:

Import-Csv 生成具有 string 属性的对象列表,这与您的 bool 参数不匹配。您需要将字符串转换为实际的布尔值,以使输出与您的函数一起使用:

$payload = ConvertFrom-Csv "Foo
True
False" | Select-Object @{n='Foo';e={[Convert]::ToBoolean($_.Foo)}}

$payload | Get-HasFoo

【讨论】:

  • 是的。我期待 PowerShell 将字符串转换为布尔值,但即使在 cmdline 上明确传递字符串也会失败:get-hasfoo -Foo "true"
  • 虽然这应该可行,但与简单的 Foreach-Object 构造相比,写起来会很痛苦,[bool]$_.Foo 在里面
  • @SteveB 除了[bool]$_.Foo 没有做你显然期望它做的事情。
  • 哼,你是对的:$payload | % { Get-HasFoo -Foo ([bool]$_.Foo) } 两次返回True,而不是True,False
  • @SteveB 这是因为将字符串转换为布尔值与解析布尔值的字符串表示不同。前者基于字符串的长度(空字符串计算为$false,非空字符串计算为$true)。
猜你喜欢
  • 2013-12-21
  • 1970-01-01
  • 2021-01-24
  • 2020-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-12
相关资源
最近更新 更多