1

我是 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
    }
}

我希望命令像这样工作:

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

但是我收到以下错误:

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

了解我是 PowerShell 的新手,如何让这个简单的示例正常工作?

4

1 回答 1

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-Objectcmdlet 调用该函数:

Import-CSV C:\temp\myfile.csv | Foreach-Object { HelloWorld -Url $_.Url -Email $_.Email }
于 2013-06-13T19:05:06.513 回答