首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Powershell foreach-object循环似乎并不总是运行每个对象的进程块。

Powershell foreach-object循环似乎并不总是运行每个对象的进程块。
EN

Stack Overflow用户
提问于 2014-08-11 19:15:48
回答 2查看 720关注 0票数 1

当我运行get-childitem charsets.pack时,我看到:

代码语言:javascript
复制
PS C:\opt\jdk\jdk7u67\jre\lib> Get-ChildItem .\charsets.pack


    Directory: C:\opt\jdk\jdk7u67\jre\lib


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2014-07-25  10:24 AM    2172877 charsets.pack

因此,当我运行Get-ChildItem *.pack | ForEach-Object -Process {get-childitem $_.name}时,我希望看到对每个文件重复前面的输出。相反,我得到了

代码语言:javascript
复制
PS C:\opt\jdk\jdk7u67\jre\lib> Get-ChildItem *.pack | ForEach-Object -Process {get-childitem $_.name}


    Directory: C:\opt\jdk\jdk7u67\jre\lib


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2014-07-25  10:24 AM    2172877 charsets.pack
-a---        2014-07-25  10:24 AM    1940370 deploy.pack
-a---        2014-07-25  10:24 AM     221856 javaws.pack
-a---        2014-07-25  10:24 AM    4163103 jfxrt.pack
-a---        2014-07-25  10:24 AM     176166 jsse.pack
-a---        2014-07-25  10:24 AM     532239 plugin.pack
-a---        2014-08-11  11:30 AM   18345177 rt.pack

怎么回事?它看起来并不是为每个对象实际运行流程块,而是在进行某种优化。但是当我运行Get-ChildItem *.pack | ForEach-Object -Process {Get-Date}时,我得到了我所期望的:

代码语言:javascript
复制
PS C:\opt\jdk\jdk7u67\jre\lib> Get-ChildItem *.pack | ForEach-Object -Process {Get-Date}

Monday, 11 August, 2014 12:11:30
Monday, 11 August, 2014 12:11:30
Monday, 11 August, 2014 12:11:30
Monday, 11 August, 2014 12:11:30
Monday, 11 August, 2014 12:11:30
Monday, 11 August, 2014 12:11:30
Monday, 11 August, 2014 12:11:30

Fwiw,我更习惯于抨击,并且可能带来了这些期望。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-11 20:42:26

我认为真正的问题是你误解了管道的工作原理。您的ForEach正在将一个[ FileInfo ](http://msdn.microsoft.com/en-us/library/system.io.fileinfo(v=vs.110%29.aspx)对象输出到管道的末端,因为它没有指定输出,因此它将到达管道末端的所有内容输出到格式化程序,并将集合指定为FileInfo对象的数组并显示它们,如OP所示。

如果您想要查看每个文件输出,您必须将Get-ChildItem输送到Out-String,或者在ForEach循环中这样做。虽然这实际上是在做双重的工作,因为最初的Get将FileInfo对象传递给ForEach循环,而执行Get-ChildItem $_.Name (您可能在那里指的是FullName )提供了完全相同的FileInfo对象,因此可以缩短为$_ | Out-String

因此,在ForEach循环期间,您实际上没有输出到主机,您只是将一个FileInfo对象输入到要处理的ForEach循环中,然后查找该对象并在管道中提供该对象以延迟输出,就好像您的ForEach循环不存在一样。

我希望这能帮你理清问题。

票数 4
EN

Stack Overflow用户

发布于 2014-08-11 20:10:22

Get-ChildItem基本上相当于dirls (PowerShell实际上将这些化名为Get-ChildItem)。

因此,就像现在一样,您正在尝试为单个文件获取子文件(而他们没有子文件)。另一种方法是调用Get-Item $_.Name,尽管这看起来有点傻,因为它的输出将是$_首先引用的相同对象。

我可能误解了您想要的内容,但我认为您只需要在您的块中使用$_即可。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25250707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档