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-Object上記がなくても、コマンドレットを使用して関数を呼び出すことができます。

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