2010-08-16 67 views
160

我在PowerShell中看到了很多,但它究竟做了什麼?

$_ 
+5

很好的問題。我想爲其他暗示的標記提供更多的信息 – MattUebel 2010-08-26 12:56:29

+2

當然,這個問題已經回答了給出的單個特殊標記,但是爲了說明PowerShell特殊標記的所有壁掛圖,請參閱[PowerShell標點符號完整指南]( https://www.simple-talk.com/sysadmin/powershell/the-complete-guide-to-powershell-punctuation/) – 2016-11-16 22:04:12

回答

122

這是管道中當前值的變量。

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

例如,在上面的代碼%{}塊被稱爲該數組中的每一個值。 $_變量將包含當前值。

+31

這不一定與管道有關。這更多的是「當前正在執行的腳本塊的當前參數」。例如,雖然你可以在ForEach-Object或Where-Object中使用它,但是你不能像'Get-Foo | Add-Member NoteProperty Bar($ _。SomeProperty)'那樣使用它 - 有一個涉及的管道,但沒有腳本塊,因此沒有'$ _'。 (也就是說,PowerShell的幫助也指'$ _'的管道。令人困惑) – Joey 2010-08-16 16:23:54

+2

@JaredPar請自$ PS3以後添加有關$ PSItem作爲別名的信息。 – ALIENQuake 2015-07-22 17:46:44

+0

@Joey你可以在你的例子中完全使用$ _。 'Get-Foo | Add-Member -Type NoteProperty -Name Bar -Value $ _。SomeProperty' – Xalorous 2015-11-06 16:38:00

22

this網站,它以this參考,主要是在循環。

$ _(美元下劃線) 'THIS'令牌。通常指的是foreach循環內的 項目。 任務: 打印集合中的所有項目。 解決方案。 ... | foreach {Write-Host $ _}

+0

+1鏈接 – Micah 2010-08-16 14:48:07

+13

+1雙關語:'據此,這是一個參考這個'。 – Neolisk 2013-06-12 20:31:28

+1

'this'是'$ _'變量的一個相當混亂的術語。在OOP中它通常指的是類,而不是變量。 – 2015-11-06 16:39:46

29

我想在C#中的lambda表達式中考慮這個變量的最簡單方法就像輸入參數。即$_類似於xx => Console.WriteLine(x) C#中的匿名函數。考慮下面的例子:

的PowerShell:

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

打印:

1 
2 
3 

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

打印:

2 
3 

並採用與C#語法比較這LINQ:

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 
+3

在C#中,不要在lambda中使用'_'作爲輸入參數。當參數被忽略時有時使用'_',用x代替。 http://stackoverflow.com/questions/424775/is-there-a-better-way-to-express-a-parameterless-lambda-than – 2013-10-14 17:54:31

1

$ _是一個變量,迭代從前一個|傳遞的每個對象/元素(管)。

0

$_通常是內部由小命令引用塊表達式是與管的系統所使用創建的變量如Where-ObjectForEach-Object

但它也可用於其他類型的表達式,例如與Select-Object結合使用表達式屬性。 Get-ChildItem | Select-Object @{Name="Name";Expression={$_.Name}}。在這種情況下,$_表示正在管理的項目,但可能存在多個表達式。

它也可以通過自定義參數驗證來引用,其中腳本塊用於驗證值。在這種情況下,$_代表從調用中收到的參數值。

與c#和java最接近的比喻是lamda表達式。如果您將PowerShell分解爲基礎知識,那麼一切都是包含腳本文件a,函數和cmdlet的腳本塊。您可以定義自己的參數,但在某些情況下系統會爲您創建一個代表的輸入項以處理/評估。在這些情況下,自動變量是$_