如果您完全熟悉 LINQ 或 SQL,那么它应该更容易理解,因为它对相同的词使用相同的概念并稍作调整。
Where-Object
用于从管道中过滤掉对象,类似于 SQL 过滤行的方式。在这里,将对象与条件或可选的ScriptBlock 进行比较,以确定是否应将其传递给管道中的下一个 cmdlet。演示:
# Approved Verbs
Get-Verb | Measure-Object # count of 98
Get-Verb | Where-Object Verb -Like G* | Measure-Object # 3
# Integers 1 to 100
1..100 | Measure-Object # count of 100
1..100 | Where-Object {$_ -LT 50} | Measure-Object # count of 49
当不使用ScriptBlock 时,这种语法通常是最易读的,但如果您想引用对象本身(不是属性)或更复杂的布尔结果,则这种语法是必需的。注意:许多资源会建议(正如@Iftimie Tudor 提到的那样)尝试在管道中更快(更多)过滤以获得性能优势。
Select-Object
用于过滤对象的属性,类似于 SQL 过滤列的方式。重要的是,它将管道对象转换为一个新的PSCustomObject,它只具有复制了对象值的请求属性。演示:
Get-Process
Get-Process | Select-Object Name,CPU
但请注意,这只是标准用法。使用 Get-Help Select-Object 探索其参数集,其中它具有类似的行式过滤功能,例如仅从管道(又名 Get-Process | Select-Object -First 3)中获取前 n 个对象,然后继续到下一个 cmdlet。
ForEach-Object
就像您在其他语言中的 foreach 循环一样,具有自己的 important 风格。事实上,PowerShell 也有自己的foreach 循环!这些可能很容易混淆,但在操作上却大不相同。主要的视觉区别是foreach 循环不能在管道中使用,但ForEach-Object 可以。后者 ForEach-Object 是一个 cmdlet(foreach 不是),可用于转换当前管道或针对管道运行一段代码。它确实是最灵活的 cmdlet。
考虑它的最佳方式是,它是循环体,其中当前元素$_ 来自管道,并且任何输出都传递到下一个 cmdlet。演示:
# Transform
Get-Verb | ForEach-Object {"$($_.Verb) comes from the group $($_.Group)"
# Retrieve Property
Get-Verb | ForEach-Object Verb
# Call Method
Get-Verb | ForEach-Object GetType
# Run Code
1..100 | ForEach-Object {
$increment = $_ + 1
$multiplied = $increment * 3
Write-Output $multiplied
}