PowerShellでは$ _はどういう意味ですか?


226

PowerShellで次のことをたくさん見ましたが、正確には何をしますか?

$_

5
もちろん、質問は与えられた単一の特別なトークンについて回答されていますが、PowerShellのすべての特別なトークンを説明するウォールチャートについては、The PowerShell Guide to PowerShell Punctuation
Michael Sorens

回答:


171

これは、$PSItemPowershell 3以降で呼び出されるパイプラインの現在の値の変数です。

1,2,3 | %{ write-host $_ } 

または

1,2,3 | %{ write-host $PSItem } 

たとえば、上記のコード%{}では、配列内のすべての値に対してブロックが呼び出されます。$_または$PSItem変数の現在の値が含まれます。


42
必ずしもパイプラインに関連しているわけではありません。これは、「現在実行中のスクリプトブロックに対する現在の引数」です。たとえば、問題なく使用できるForEach-Object場合や、Where-Object使用できない場合Get-Foo|Add-Member NoteProperty Bar ($_.SomeProperty)–パイプラインが含まれますが、スクリプトブロックがないため、はありません$_。(とはいえ、PowerShellのヘルプでは、$_。のパイプラインも参照しています。混乱を招きます。)
Joey

@Joeyでは、例で$ _を絶対に使用できます。Get-Foo | Add-Member -Type NoteProperty -Name Bar -Value $_.SomeProperty
Xalorous 2015年

@Xalorous:エラーを生成しないからといってGet-ChildItem | Add-Member -Type NoteProperty -Name Bar -Value $_.Name -PassThru | Select Bar、それ機能することを意味するわけではありません$_。しかし、それはあなたがそのようなものを書こうとするときにあなたが通常意味するものとは大きく異なります。
Joey

$_あなたが書いたものの@Joey は、何らかの理由で、すべてのオブジェクトをループしていません。代わりにこれを試してください。 gci | % { $_ | add-member -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar。私が持つと思われるgci | cmdlet明示のforeachなしするGCI結果を収集し、コマンドレットにアレイを通過しています。ただし、配列はオブジェクトであるため、配列オブジェクトにプロパティを追加しています。配列には 'name'プロパティがないため、$ _。Barに割り当てられる値は$ nullです。結論として、$ _はパイプライン処理で広範囲に使用されます。ループするために%{}を必要としないのは新しいことです。
Xalorous 2015年

余分なパイプラインを削除した作業バージョン。 gci | % { add-member -InputObject $_ -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar
Xalorous 2015年

37

この変数をC#のラムダ式の入力パラメーターのように考える最も簡単な方法だと思います。すなわち$_に似ているxではx => Console.WriteLine(x)C#で無名関数。次の例を検討してください。

パワーシェル:

1,2,3 | ForEach-Object {Write-Host $_}

プリント:

1
2
3

または

1,2,3 | Where-Object {$_ -gt 1}

プリント:

2
3

そして、これをLINQを使用したC#構文と比較します。

var list = new List<int> { 1, 2, 3 };
list.ForEach( _ => Console.WriteLine( _ ));

プリント:

1
2
3

または

list.Where( _ => _ > 1)
    .ToList()
    .ForEach(s => Console.WriteLine(s));

プリント:

2
3

6
C#_では、ラムダの入力パラメーターとして使用しないでください。_パラメータが無視される場合に使用されることがあります。代わりにxを使用してください。stackoverflow.com/questions/424775/…–
カルロスムニョス

28

このウェブサイトによると、それはへの参照ですthis、ほとんどがループです。

$ _(ドルの下線) 'THIS'トークン。通常、foreachループ内のアイテムを参照します。タスク:コレクション内のすべてのアイテムを印刷します。解決。... | foreach {書き込みホスト$ _}


3
this$_変数のやや紛らわしい用語です。OOPでは通常、変数ではなくクラスを指します。
oɔɯǝɹ

1
特にPS v5がクラスで使用する$ this変数を追加するときの@remco。
Xalorous 2015年


1

$ _は、前に渡された各オブジェクト/要素を反復する変数です。(パイプ)。


1

$_通常内部のような管で使用されるコマンドレットによって参照される式ブロックシステムによって作成された変数であるWhere-ObjectとしますForEach-Object

ただし、他のタイプの式、たとえばSelect-Object式プロパティと組み合わせて使用することもできます。Get-ChildItem | Select-Object @{Name="Name";Expression={$_.Name}}。この場合、$_パイプされているアイテムを表しますが、複数の式が存在する可能性があります。

また、スクリプトブロックを使用して値を検証するカスタムパラメータ検証で参照することもできます。この場合、$_は呼び出しから受け取ったパラメーター値を表します。

c#とjavaに最も近い例は、ラムダ式です。PowerShellを基本に分解すると、スクリプトファイルa、関数、コマンドレットを含むすべてがスクリプトブロックになります。独自のパラメーターを定義できますが、処理/評価する入力項目を表すパラメーターがシステムによって作成される場合があります。これらの状況では、自動変数は$_です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.