【问题标题】:Powershell ForEach Loop FailingPowershell ForEach 循环失败
【发布时间】:2018-03-13 14:56:25
【问题描述】:

我正在尝试为我的 MDT 部署共享中的所有 WIM 文件生成报告。基本上,我认为需要对找到的所有 WIM 文件执行 ForEach 循环。我有我认为应该工作的东西,但显然,它没有。我还有多远?

$WimPath = "G:\DeploymentShare\Operating Systems"

Get-ChildItem -Path $WimPath -Filter *.wim -Recurse -File | Select-Object -ExpandProperty VersionInfo | Select-Object FileName | ForEach-Object { Get-WindowsImage -ImagePath $_ }

我看到的错误是关于 Get-WindowsImage 命令的参数不正确。

Get-WindowsImage : The parameter is incorrect.
At line:3 char:147
+ ... t-Object FileName | ForEach-Object { Get-WindowsImage -ImagePath $_ }
+                                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

我认为我的Select-Object 没有像我认为的那样工作,或者我没有在我的Get-WindowsImage 命令中正确使用管道。

【问题讨论】:

  • 试试Get-ChildItem -Path $WimPath -Filter *.wim -Recurse -File | ForEach-Object { Get-WindowsImage -ImagePath $_.fullname }
  • @Brendand62269,干得好!我想知道我是否甚至需要Select-Object。我想我没有...我如何将您标记为正确回答的人?

标签: powershell foreach powershell-5.0 mdt


【解决方案1】:

我是 PowerShell 菜鸟,并不完全理解这一点,但我认为可以通过首先关注命令的这一部分来解释发生了什么:

Get-ChildItem -Path $WimPath -Filter *.wim -Recurse -File | Select-Object -ExpandProperty VersionInfo | Select-Object FileName 

为此,我们首先获取路径中的所有*.wim 文件,展开 VersionInfo 属性,然后选择 FileName。在控制台中,这将显示如下结果:

文件名 -------- [这里的文件]

诀窍在于了解 PowerShell 通过此输出告诉您什么。您看到 FileName 标头的事实意味着管道有一个 Objects 流,其中一个属性名为 FileName。然后我们将该对象流发送到ForEach-Object 并查看$_ 特殊变量。

希望现在更清楚发生了什么。 Get-WindowsImage -ImagePath $_ 想要查看保存 *.wim 文件路径的字符串值。但是我们向它发送了一个具有一个属性的对象。

您可以通过几种方式解决此问题...将ExpandProperty 添加到第二个Select-Object 可能会做到这一点。但实际上根本没有理由在其中放置两个Select-Objects。我认为你可以这样做:

Get-ChildItem -Path $WimPath -Filter *.wim -Recurse -File | Select-Object -ExpandProperty FullName | ForEach-Object { Get-WindowsImage -ImagePath $_ }

这里的技巧是您在 Get-ChildItem 的 shell 中看到的字符串表示不一定显示对象中的每个属性。不会有空间。 FileName 始终存在,您可以通过检查 Get-Member cmdlet 来查看它,如下所示:

Get-ChildItem -Path $WimPath -Filter *.wim -Recurse -File | Get-Member

【讨论】:

  • 和你一样,我也是个noob。很好地抓住了Get-WindowsImage 命令所需的string 值。现在我看了一下,文档说明这正是所需要的。我在搞乱Get-ChildItem -Path $WimPath -Filter *.wim -Recurse -File | Select-Object -ExpandProperty VersionInfo | Select-Object FileName 并且认为它给了我我需要的东西。我不完全明白它给了我什么类型的数据,我仍然不完全明白如何弄清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-11
  • 2019-09-19
  • 2015-09-27
相关资源
最近更新 更多