-1

これにぴったりのタイトルを考えるのに苦労しました。モッズの方は、もっといいタイトルが思いついたら自由に編集してください。

パワーシェル 3。

サンプル関数は次のとおりです。

Function New-Cmdlet
{
    [CmdletBinding(SupportsShouldProcess=$True)]
    Param([Parameter(Mandatory=$True,ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)]
                [String[]]$ComputerName)
    BEGIN
    {            
        Write-Verbose -Message "Cmdlet is starting."
    }
    PROCESS
    {            
        Write-Verbose -Message "Beginning Process block on $ComputerName"
    }
    END
    {
        Write-Verbose -Message "Running End block."
    }
}

を実行するGet-Content C:\hosts.txt | New-Cmdletと、hosts.txt で見つかったエントリごとに PROCESS ブロックが 1 回実行されます。これは良いことであり、正しいことです。

を実行する"host1","host2" | New-Cmdletと、PROCESS ブロックが 2 回実行されます。ホスト 1 に対して 1 回、ホスト 2 に対してもう一度。繰り返しますが、それは良いことであり、正しいことです。

しかし、私が実行したNew-Cmdlet -ComputerName "host1","host2"場合、または私が考えることができる他のバリアントについてはNew-Cmdlet -ComputerName @("host1","host2")... PROCESS ブロックは一度だけ実行されます。 これは悪いことです。

各シナリオでこれを適切に機能させるために何ができるか考えていますか?

4

3 に答える 3

1

数年前、TechNet フォーラムで同じ質問をしました。

http://social.technet.microsoft.com/Forums/windowsserver/en-US/fc0bf987-a4f2-4ebb-9ff3-8c4acef346ed/process-pipeline-input-and-parameter-input-the-same-way

Copy-Item の -Path パラメータと同じ動作が欲しかった

コピー項目 ・パス「File.txt」、「File2.txt」 ・コピー先「D:\」

"File.txt"、"File2.txt" | コピー項目 -コピー先「D:\」

あなたが言うように...コンテンツがパイプラインから受信されると、すでに冗長なスカラー値をループする必要があります。このような...

Function DoStuff {

    Param (   
        [Parameter(Mandatory=$True, ValueFromPipeline=$True)][string[]]$Item
    )

    Process {
        $Item | ForEach-Object {
            # Do the stuff here
        }
    }
}

Microsoft がどのようにそれを行ったかを確認するために、JustDecompile の Microsoft の Copy-Item CmdLet を調べました。彼らは同じようにそれを行います... Path-parameter は、ProcessRecord 実装でループする配列です。

于 2013-07-05T17:06:29.793 に答える