回答:
これは、$PSItem
Powershell 3以降で呼び出されるパイプラインの現在の値の変数です。
1,2,3 | %{ write-host $_ }
または
1,2,3 | %{ write-host $PSItem }
たとえば、上記のコード%{}
では、配列内のすべての値に対してブロックが呼び出されます。$_
または$PSItem
変数の現在の値が含まれます。
ForEach-Object
場合や、Where-Object
使用できない場合Get-Foo|Add-Member NoteProperty Bar ($_.SomeProperty)
–パイプラインが含まれますが、スクリプトブロックがないため、はありません$_
。(とはいえ、PowerShellのヘルプでは、$_
。のパイプラインも参照しています。混乱を招きます。)
Get-Foo | Add-Member -Type NoteProperty -Name Bar -Value $_.SomeProperty
Get-ChildItem | Add-Member -Type NoteProperty -Name Bar -Value $_.Name -PassThru | Select Bar
、それが機能することを意味するわけではありません$_
。しかし、それはあなたがそのようなものを書こうとするときにあなたが通常意味するものとは大きく異なります。
$_
あなたが書いたものの@Joey は、何らかの理由で、すべてのオブジェクトをループしていません。代わりにこれを試してください。 gci | % { $_ | add-member -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar
。私が持つと思われるgci | cmdlet
明示のforeachなしするGCI結果を収集し、コマンドレットにアレイを通過しています。ただし、配列はオブジェクトであるため、配列オブジェクトにプロパティを追加しています。配列には 'name'プロパティがないため、$ _。Barに割り当てられる値は$ nullです。結論として、$ _はパイプライン処理で広範囲に使用されます。ループするために%{}を必要としないのは新しいことです。
gci | % { add-member -InputObject $_ -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar
この変数を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
_
では、ラムダの入力パラメーターとして使用しないでください。_
パラメータが無視される場合に使用されることがあります。代わりにxを使用してください。stackoverflow.com/questions/424775/…–
このウェブサイトによると、それはへの参照ですthis
、ほとんどがループです。
$ _(ドルの下線) 'THIS'トークン。通常、foreachループ内のアイテムを参照します。タスク:コレクション内のすべてのアイテムを印刷します。解決。... | foreach {書き込みホスト$ _}
this
$_
変数のやや紛らわしい用語です。OOPでは通常、変数ではなくクラスを指します。
$ _は、自動変数$ PSItem(PowerShell V3.0で導入されました。 、パイプからの現在のアイテムを表すました。ここにある使用情報)の。
自動変数に関するPowerShell(v6.0)オンラインドキュメントはこちらです。
$_
通常内部のような管で使用されるコマンドレットによって参照される式ブロックシステムによって作成された変数であるWhere-Object
としますForEach-Object
。
ただし、他のタイプの式、たとえばSelect-Object
式プロパティと組み合わせて使用することもできます。Get-ChildItem | Select-Object @{Name="Name";Expression={$_.Name}}
。この場合、$_
パイプされているアイテムを表しますが、複数の式が存在する可能性があります。
また、スクリプトブロックを使用して値を検証するカスタムパラメータ検証で参照することもできます。この場合、$_
は呼び出しから受け取ったパラメーター値を表します。
c#とjavaに最も近い例は、ラムダ式です。PowerShellを基本に分解すると、スクリプトファイルa、関数、コマンドレットを含むすべてがスクリプトブロックになります。独自のパラメーターを定義できますが、処理/評価する入力項目を表すパラメーターがシステムによって作成される場合があります。これらの状況では、自動変数は$_
です。