powershell Where对象、Select对象和ForEach对象的区别和用法

6rvt4ljy  于 2023-03-02  发布在  Shell
关注(0)|答案(2)|浏览(273)

Where-ObjectSelect-ObjectForEach-Object
我是一个PowerShell初学者,我不太懂,谁能举个例子来说明一下它们之间的区别和使用场景?

djmepvbi

djmepvbi1#

如果您熟悉LINQ或SQL,那么它应该更容易理解,因为它对相同的单词使用了相同的概念,只是稍微做了一些调整。
∮ ∮ ∮ ∮ ∮一个月一个月
用于从管道中筛选出对象,类似于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

not使用ScriptBlock时,这个语法通常是最可读的,但是如果你想引用对象本身(而不是属性)或者更复杂的布尔结果,这个语法是必要的。许多资源将推荐(如@Iftimie Tudor所提到的)尝试在管道中更快地(更多地)过滤以获得性能益处。

Select-Object

用于筛选对象的属性,类似于SQL筛选列的方式。重要的是,它将管道对象转换为新的PSCustomObject,该PSCustomObject仅具有复制了对象值的请求属性。

Get-Process
Get-Process | Select-Object Name,CPU

请注意,这只是标准用法。使用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。

# 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
}
    • 编辑(2023年2月):**感谢@IkemKrueger提供缺失的}
xmjla07d

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章)

相关问题