有什么区别ForEach和ForEach-Object?
我有一个像这样的小代码,工作正常
$txt = Get-Content 'C:\temp\000.txt'
$result = foreach ($line in $txt) {$line.replace(".ini","")}
$result | out-file 'c:\temp\001.txt'
Run Code Online (Sandbox Code Playgroud)
但如果我使用'ForEach-Object',我就会出错......
$txt = Get-Content 'C:\temp\000.txt'
$result = foreach-object ($line in $txt) {$line.replace(".ini","")}
$result | out-file 'c:\temp\001.txt'
Run Code Online (Sandbox Code Playgroud)
为什么?以及如何使用输出循环结果ForEach-Object
Eta*_*ner 21
foreach是别名,ForEach-Object但它似乎也是一个关键字(这是令人困惑的).
foreach ($<item> in $<collection\>){<statement list>}您正在使用的语法是help about_foreach.
在foreach作为ForEach-Object别名help ForEach-Object.
关键字在bit中给出的foreach每个$<item>中操作.$<collection>()
别名foreach/函数ForEach-Object对作为输入接收的集合的每个项目进行操作.
Fox*_*loy 18
它们是用于不同目的的不同命令.ForEach-Object cmdlet在管道中使用,您可以使用$ PSItem或$ _来引用当前对象,以便运行{scriptblock},如下所示:
1..5 | ForEach-Object {$_}
>1
>2
>3
>4
>5
Run Code Online (Sandbox Code Playgroud)
现在,您还可以在行的开头使用非常类似的关键字 ForEach.在这种情况下,您可以运行{scriptblock}来定义变量名称,如下所示:
ForEach ($number in 1..5){$number}
>1
>2
>3
>4
>5
Run Code Online (Sandbox Code Playgroud)
这里的核心区别在于您使用命令的位置,一个用于管道中,另一个用于启动自己的管道.在生产样式脚本中,我建议使用ForEach关键字而不是cmdlet.
先前的两个答案都是正确的,但是https://blogs.technet.microsoft.com/heyscriptingguy/2014/07/08/getting-to-know-foreach-and-foreach-object/都有很好的总结:
将输入管道传递到ForEach时,它是ForEach-Object的别名。但是,当您将ForEach放在行的开头时,它是Windows PowerShell语句。
以及更多详细信息:
ForEach语句将所有项目预先加载到集合中,然后一次处理它们。ForEach-Object希望项目通过管道进行流传输,从而降低了内存需求,但同时也影响了性能。
然后,他包括一些性能度量并得出以下结论:
那么,您使用哪一个呢?好吧,答案是“取决于情况”。您可以使用ForEach语句或ForEach-Object cmdlet遍历项目集合。如果您有足够的内存,想要最佳的性能并且不关心通过管道将输出传递给另一个命令,那么ForEach就是完美的选择。ForEach-Object(别名为%和ForEach)从管道中获取输入。尽管处理所有内容的速度较慢,但它为您带来了Begin,Process和End块的好处。另外,它允许您通过管道将对象流式传输到另一个命令。最后,使用最适合您的需求和系统功能的方法。
除了之前提到的技术差异之外,为了完整起见,这里还有一些实际差异(另请参阅):
1.) 在管道中,您不知道已处理项目的总数。在这种情况下,您会选择首先获取完整列表,然后执行 foreach 循环。
例子:
$files = gci "c:\fakepath"
$i = 0
foreach ($file in $files) {
$i++
Write-Host "$i / $($files.Count) processed"
}
Run Code Online (Sandbox Code Playgroud)
2.) 对于现有列表,foreach循环比管道版本更快,因为不必每次都调用脚本块。(但根据您所做的工作和项目数量,差异可能可以忽略不计。)
例子:
$items = 0..100000
Measure-Command { $items | ForEach-Object { $_ } }
# ~500ms on my machine
Measure-Command { foreach ($i in $items) { $i } }
# ~70ms on my machine
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
36043 次 |
| 最近记录: |