0

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

$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命令中正确使用管道。

4

1 回答 1

1

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

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

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

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

诀窍在于了解 PowerShell 通过此输出告诉您什么。您看到FileName标头的事实意味着管道有一个对象流,其中一个属性名为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 $_ }

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

Get-ChildItem -Path $WimPath -Filter *.wim -Recurse -File | Get-Member
于 2017-10-02T15:06:14.690 回答