Powershell ForEach循环失败

时间:2017-10-02 14:08:57

标签: powershell foreach powershell-v5.0 mdt

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

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

1 个答案:

答案 0 :(得分:1)

我是一个PowerShell noob并且没有完全理解这一点,但我认为正在发生的事情可以通过首先关注命令的这一部分来解释:

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

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

FileName
--------
[files here]

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

希望现在发生的事情更清楚了。 Get-WindowsImage -ImagePath $_想要查看包含* .wim文件路径的字符串值。但我们发送了一个带有一个属性的对象。

您可以通过以下几种方式解决此问题......将ExpandProperty添加到第二个Select-Object可能会这样做。但实际上没有理由在那里有两个Select-Object。我想你可以这样做:

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