Where-Object、Select-Object和ForEach-Object我是一个PowerShell初学者,我不太懂,谁能举个例子来说明一下它们之间的区别和使用场景?
Where-Object
Select-Object
ForEach-Object
djmepvbi1#
如果您熟悉LINQ或SQL,那么它应该更容易理解,因为它对相同的单词使用了相同的概念,只是稍微做了一些调整。∮ ∮ ∮ ∮ ∮一个月一个月用于从管道中筛选出对象,类似于SQL筛选行的方式。在这里,对象与条件或ScriptBlock(可选)进行比较,以确定是否应将其传递给管道中的下一个cmdlet。要进行演示:
ScriptBlock
# 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
当not使用ScriptBlock时,这个语法通常是最可读的,但是如果你想引用对象本身(而不是属性)或者更复杂的布尔结果,这个语法是必要的。许多资源将推荐(如@Iftimie Tudor所提到的)尝试在管道中更快地(更多地)过滤以获得性能益处。
用于筛选对象的属性,类似于SQL筛选列的方式。重要的是,它将管道对象转换为新的PSCustomObject,该PSCustomObject仅具有复制了对象值的请求属性。
PSCustomObject
Get-Process Get-Process | Select-Object Name,CPU
请注意,这只是标准用法。使用Get-Help Select-Object探索其参数集,其中它具有类似行的过滤功能,例如仅从管道(aka,Get-Process | Select-Object -First 3)获取前n个对象,这些对象将继续到下一个cmdlet。
Get-Help Select-Object
Get-Process | Select-Object -First 3
就像其他语言中的foreach循环一样,有着自己的"重要"风格。实际上,PowerShell也有自己的foreach循环!它们可能很容易混淆,但在操作上有很大的不同。主要的视觉差异是foreach循环不能用于管道中,但ForEach-Object可以。后者ForEach-Object,是一个cmdlet(foreach不是),可用于转换当前管道或针对管道运行代码段。它确实是最灵活的cmdlet。最好的理解方式是,它是循环的主体,其中当前元素$_来自管道,任何输出都传递到下一个cmdlet。
foreach
$_
# 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 }
}
xmjla07d2#
里面有两样东西过滤和迭代通过集合。1.过滤:原则:总是尽可能多地使用过滤左侧。这两个命令做同样的事情,但第二个命令不会通过管道(或网络)传输大量数据:获取过程|where-对象{$_.Name -类似于“chrome”}|导出-csv“c:\temp\进程.csv”获取进程名称chrome|导出-Csv c:\临时\进程.csv这在处理大量计算机或大文件时非常有用。许多commandlet都有自己的过滤功能,在管道传输之前运行getx 1 m0n1x看看它们提供了什么。1.遍历集合:这里有3种可能性:
*batch cmdlet是内置的commandlet,能够将集合传递给另一个commandlet:
获取服务名BITS、假脱机程序、W32时间|设置服务启动类型自动
*WMI方法- WMI使用自己的方法执行第一个(不同的语法)
gwmi win32_networkadapterconfiguration -筛选器“描述类似于”%intel %“”|启用DHCP()
*枚举对象-遍历列表:
获取WmiObject Win32_Service -筛选器“名称=”BITS“”|对于每个对象进程{ $_.更改($空,$空,$空,$空,$空,$空,$空,$空,“P@ssw0rd”)}
学分:我在一本书中找到了解释,它清除了我头脑中关于所有这些事情的混乱,书名是:用一个月的午餐时间学习Powershell(本例中为第9章和第13章)
2条答案
按热度按时间djmepvbi1#
如果您熟悉LINQ或SQL,那么它应该更容易理解,因为它对相同的单词使用了相同的概念,只是稍微做了一些调整。
∮ ∮ ∮ ∮ ∮一个月一个月
用于从管道中筛选出对象,类似于SQL筛选行的方式。在这里,对象与条件或
ScriptBlock
(可选)进行比较,以确定是否应将其传递给管道中的下一个cmdlet。要进行演示:当not使用
ScriptBlock
时,这个语法通常是最可读的,但是如果你想引用对象本身(而不是属性)或者更复杂的布尔结果,这个语法是必要的。许多资源将推荐(如@Iftimie Tudor所提到的)尝试在管道中更快地(更多地)过滤以获得性能益处。Select-Object
用于筛选对象的属性,类似于SQL筛选列的方式。重要的是,它将管道对象转换为新的
PSCustomObject
,该PSCustomObject
仅具有复制了对象值的请求属性。请注意,这只是标准用法。使用
Get-Help Select-Object
探索其参数集,其中它具有类似行的过滤功能,例如仅从管道(aka,Get-Process | Select-Object -First 3
)获取前n个对象,这些对象将继续到下一个cmdlet。一米七六
就像其他语言中的
foreach
循环一样,有着自己的"重要"风格。实际上,PowerShell也有自己的foreach
循环!它们可能很容易混淆,但在操作上有很大的不同。主要的视觉差异是foreach
循环不能用于管道中,但ForEach-Object
可以。后者ForEach-Object
,是一个cmdlet(foreach
不是),可用于转换当前管道或针对管道运行代码段。它确实是最灵活的cmdlet。最好的理解方式是,它是循环的主体,其中当前元素
$_
来自管道,任何输出都传递到下一个cmdlet。}
。xmjla07d2#
里面有两样东西过滤和迭代通过集合。
1.过滤:原则:总是尽可能多地使用过滤左侧。这两个命令做同样的事情,但第二个命令不会通过管道(或网络)传输大量数据:
获取过程|where-对象{$_.Name -类似于“chrome”}|导出-csv“c:\temp\进程.csv”
获取进程名称chrome|导出-Csv c:\临时\进程.csv
这在处理大量计算机或大文件时非常有用。
许多commandlet都有自己的过滤功能,在管道传输之前运行getx 1 m0n1x看看它们提供了什么。
1.遍历集合:
这里有3种可能性:
*batch cmdlet是内置的commandlet,能够将集合传递给另一个commandlet:
获取服务名BITS、假脱机程序、W32时间|设置服务启动类型自动
*WMI方法- WMI使用自己的方法执行第一个(不同的语法)
gwmi win32_networkadapterconfiguration -筛选器“描述类似于”%intel %“”|启用DHCP()
*枚举对象-遍历列表:
获取WmiObject Win32_Service -筛选器“名称=”BITS“”|对于每个对象进程{ $_.更改($空,$空,$空,$空,$空,$空,$空,$空,“P@ssw0rd”)}
学分:我在一本书中找到了解释,它清除了我头脑中关于所有这些事情的混乱,书名是:用一个月的午餐时间学习Powershell(本例中为第9章和第13章)