ValueFromPipelineByPropertyName和类型转换

时间:2015-09-29 13:17:47

标签: powershell

让我们想象一下我有这个功能:

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导入中自动转换值?

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

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

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

Add-Type $typeDef

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

但错误存在

1 个答案:

答案 0 :(得分:0)

Import-Csv会生成一个包含 string 属性的对象列表,这些属性与 bool 参数不相称。您需要将字符串转换为实际的布尔值,以使输出适用于您的函数:

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

$payload | Get-HasFoo