我是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:tempmyfile.csv | HelloWorld -Url {$。Url}邮件{$ 。电子邮件}
然而,我得到以下错误:
HelloWorld:输入对象不能绑定到任何参数该命令可能是因为该命令不接受管道输入,或者输入及其属性与所指定的任何参数不匹配接受管道输入。
理解我是新的PowerShell我如何得到这个简单的例子工作?
如果你用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:tempmyfile.csv | HelloWorld
注意,要使其工作,参数名必须与传入的对象属性命名相同(否则需要使用别名)。
如果没有上述内容,您可以使用Foreach-Object
cmdlet调用该函数:
Import-CSV C:tempmyfile.csv | Foreach-Object { HelloWorld -Url $_.Url -Email $_.Email }