我是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的新手,我将如何使用这个简单的示例?
答案 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 }