6

重複の可能性:
PowerShellで$ _はどういう意味ですか?

私はすでに他の誰かの質問と同じ主題に関する答えを見たことがありますが、私にとってはそれは質問に答えません。

Select-Object、Where-Object、ForEach-Objectなどを使用して、スクリプトブロックを渡す方法を知っています。例:

dir | ForEach-Object { $_.Name }

これは、現在のディレクトリ内のすべてのファイル名の配列を返します。

これは、C#のSelect拡張メソッドに似ています。

Dir.Select(x => x.Name)

ただし、上記のC#は、リスト内の各要素に対して関数を実行するSelectメソッドに関数を渡すため、簡単に理解できます。

ただし、PowerShellの同等のもの:

dir | ForEach-Object { param($x) $x.Name }

何も返しません。でも

& { param($x) $x.Name } (dir)[0]

期待どおりに動作します。

誰かが$_の魔法を、スクリプトの世界ではなくC#に精通している人に説明してもらえますか?特別なキーワードですか?コマンドレットに渡されるスクリプトブロックでのみ使用できますか?ForEach-Object(または他のコマンドレット)にパイプせずに呼び出すにはどうすればよいですか?すなわち:

& { $_.Name } (dir)[0]

4

2 に答える 2

9

$_パイプラインのコンテキストでのみ作成されます。つまり、出力オブジェクトをあるコマンドから別のコマンドの「入力」に渡します。$_パイプライン フィルター (関数のようなもの) の場合、powershell は変数にパイプラインの現在のオブジェクトを自動的に入力します。複数のオブジェクトがパイプラインを通過するとき、フィルターのプロセス スクリプト ブロックがオブジェクトごとに 1 回実行されることに注意することが重要であるため、ここで現在と言いました。

ここで、パイプライン オブジェクトの名前を入力パラメーターの 1 つに変更できますが、そのことを PowerShell に通知する必要があります。例:

# C:\> filter get-name-filt {Param([parameter(ValueFromPipeline=$true)]$x) $x.name}
# C:\> (dir)[0] | get-name-filt

これはコマンド ラインではあまり便利ではないため、$_ 自動変数を使用します。

于 2012-10-25T17:37:36.110 に答える
4

これ$_は現在のパイプラインアイテムです。

例えば:

 dir | ForEach-Object { $_.Name }

意味:

  1. dirコマンドを実行します
  2. 出力を次のパイプラインコマンドに渡します
  3. ForEach-Objectは、dirからの出力を$_という変数として使用します

の出力にdirはプロパティがあるため.name、パイプライン$_にも同じプロパティがあります。これは単にデータをパイプに渡す方法です

于 2012-10-25T17:38:57.840 に答える