2017-06-16 10 views
-1

2つのパラメータ(コンピュータ名またはシリアル番号)を取り、対応するコンピュータに関する情報を出力できるPowerShellスクリプトを作成しています。しかし、パイプラインから値を渡すと、常に間違ったパラメータに入ります。PowerShellのパイプライン入力が間違ったパラメータになる

は、ここに私のコードです:

Param 
(
    [Parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$True)] 
    [String]$ComputerName, 
    [Parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$True)] 
    [String]$SerialNumber 
) 

そして、それはSCCMから情報を引き出すために、これらの値を使用しています。

しかし、私は、スクリプトを呼び出すには、次の行を使用する場合:

"<ComputerName>" | .\Get-SerialNumber.ps1 -ComputerName $_ 

コンピュータ名ではなく、ComputerNameパラメーターののserialNumberパラメータに入れます。私は

"<SerialNumber>" | .\Get-SerialNumber.ps1 -SerialNumber $_ 

に置く場合

値は、ComputerNameパラメーターに渡されます。ここで何が起こっているのですか?なぜ彼らは後方に渡されていますか?

私は

.\Get-SerialNumber.ps1 -SerialNumber "<SerialNumber>" 

または

.\Get-SerialNumber.ps1 -ComptuerName "<ComputerName>" 

に入力した場合、それは正常に動作します。値がパイプラインを通過するときにのみねじれます。

私はPowerShellセッションを再開しようとしましたが、私のセッションで変なことが起こっていないことを確認し、別のコンピュータで試してみました。それでも同じように起こります。

+0

@briantistこれはリンクされた質問の複製ではありません。私はちょうどその質問/答えを見て、私の質問はその一部として答えられませんでした。この質問は、パイプラインが行う基本的なレベルを示しています。これはより高度なレベルのパイプライン使用でした。 – Randy

+0

私は同意しません。あなたの質問には、リンクされた複製が提供する基本的なパイプライン使用法の誤解が示されていました。あなたは高度な使い方ではなく、何か無効なことをしようとしていました。 – briantist

+0

@briantistはい、これは誤解であり、これはこのサイトの目的の大部分です。しかし、私の誤解は、提供されたリンクでは決して記述されていません。私はその質問とその答えを読んだ後、私が何をしようとしていたのか、これ以上の理解はできませんでした。一方、DIDの下の答えに対するコメントは、この特定の概念の理解に役立ち、私の質問に対する実際の答えを私に提供しました。 – Randy

答えて

1

これらの方法は意味がありません。パイプライン経由でComputerNameを渡し、さらに-ComputerNameを名前付きパラメータとして指定すると、パイプラインはパイプライン入力を受け入れる唯一の他のパラメータにバインドされます。同じパラメータに対して2つの異なる値を受け入れることをどのように期待しましたか?どのように使用しますか?

+0

'$ _'はパイプラインを通して渡される値を表すべきではありませんか? '-ComputerName $ _'は、パイプラインの値をComputerNameパラメータに割り当てることを意味しませんか? – Randy

+0

@Randyいいえ、まったくありません。関数内で 'Process {}'ブロックを使用し、そのプロセスブロック内で '$ ComputerName'が現在のパイプラインオブジェクトを参照する必要があります。 'Process'ブロックは、パイプラインの各項目に対して一度呼び出されます。 – briantist

+2

* '$ _'はパイプラインを通して渡される値を表すべきではありませんか?*それは* outer *パイプラインからの値を表します:' "Outer pipeline" | %{"" | 。\ Get-SerialNumber.ps1 -ComputerName $ _} 'を実行します。あなたは次のように書くことができます: '' "| 。\ Get-SerialNumber.ps1 -ComputerName {$ _} 'を使用しますが、パイプライン値を他の' ValueFromPipeline'パラメータにバインドすることはできません。 – PetSerAl

関連する問題