12

パイプライン機能を追加しようとしているスクリプトがあります。ただし、スクリプトがパイプラインの最終オブジェクトに対してのみ実行されるように見える奇妙な動作が見られます。例えば

param(
  [parameter(ValueFromPipeline=$true)]
  [string]$pipe
)

foreach ($n in $pipe) {
  Write-Host "Read in " $n
}

まったく単純ですよね?次に実行する1..10 | .\test.ps1と、1 行だけが出力されますRead in 10。複雑さに加えて、これを使用したい実際のスクリプトには、さらに多くのパラメーターがあります。

[CmdletBinding(DefaultParameterSetName="Alias")]
param (
  [parameter(Position=0,ParameterSetName="Alias")]
  [string]$Alias,

  [parameter(ParameterSetName="File")]
  [ValidateNotNullOrEmpty()]
  [string]$File

  <and so on>
)
4

1 に答える 1

16

スクリプトの本体を process{} でラップする必要があります。これにより、パイプラインで各アイテムを処理できるようになります。アイテムごとにプロセスが呼び出されるため、 for ループを廃止することもできます。

したがって、スクリプトは次のようになります。

param(
  [parameter(ValueFromPipeline=$true)]
  [string]$pipe
)
process
{
      Write-Host "Read in " $pipe
}

ここで入力処理について読むことができます: Function Input Processing Methods

于 2013-01-09T19:39:25.210 に答える