具有自定义函数参数绑定的Powershell Import-CSV

时间:2013-06-13 18:56:03

标签: powershell

我是PowerShell的新手,我正在尝试了解如何将项目通过管道传递给自定义函数。例如,我有一个看起来像这样的CSV文件:

Url,Email
"http://www.google.com","myemail@gmail.com"
"http://www.yahoo.com", "myemail@yahoo.com"

和一个看起来像这样的函数:

Function HelloWorld() {
        [CmdletBinding()]
        Param(
            [Parameter(Mandatory=$True)]
            [string]$Url,

            [Parameter(Mandatory=$True)]
            [string]$Email)
    Proces {
        Write-Host $Url $Email
    }
}

我希望命令能够像这样工作:

  

Import-CSV C:\ temp \ myfile.csv | HelloWorld -Url {$ .Url} -Email   {$ .Email}

但是我收到以下错误:

  

HelloWorld:输入对象不能绑定到任何参数   该命令要么是因为命令不接受管道输入,要么是   输入及其属性与任何参数都不匹配   拿管道输入。

了解我是PowerShell的新手,我将如何使用这个简单的示例?

1 个答案:

答案 0 :(得分:4)

如果使用ValueFromPipelineByPropertyName属性装饰每个参数,您将能够通过管道绑定值并调用函数,如下所示:

Function HelloWorld() {

        [CmdletBinding()]

        Param(
            [Parameter(Mandatory=$True,ValueFromPipelineByPropertyName=$true)]
            [string]$Url,

            [Parameter(Mandatory=$True,ValueFromPipelineByPropertyName=$true)]
            [string]$Email
       )

    Process {
        Write-Host $Url $Email
    }
}

Import-CSV C:\temp\myfile.csv | HelloWorld

请注意,为此,参数名称的名称必须与传入的对象属性相同(否则您需要使用别名)。

如果没有上述内容,您可以使用Foreach-Object cmdlet调用该函数:

Import-CSV C:\temp\myfile.csv | Foreach-Object { HelloWorld -Url $_.Url -Email $_.Email }