我是一名拥有良好PowerShell经验的InfoSec管理员。我会保持简短和甜蜜:
([WMI] "\\$comp\root\CIMV2:CIM_DataFile.Name='$path'").Version)
我使用它来调用文件版本而不是使用get-item VersionInfo.ProductVersion,因为这并不总是返回准确的值。它运作良好。但是,当$ path等于这样的东西时:
C:\Windows\System32\Macromed\Flash\Flash*.ocx
查询无效,因为找不到该文件。我想这是因为变量周围的单引号忽略了通配符。
我承认我确实找到了解决问题的方法(JPBlanc发布的答案):
Powershell get-item VersionInfo.ProductVersion incorrect / different than WMI
但是,我想知道我是否可以在现有脚本中使用通配符。
答案 0 :(得分:1)
您不能直接传递通配符,但可以使用该通配符查询文件系统,然后遍历结果。在这两种情况下,我都假设您正在远程执行此操作。
$FlashFiles = invoke-command -computername $comp {Get-ChildItem C:\Windows\System32\Macromed\Flash\Flash*.ocx;};
foreach ($File in $FlashFiles) {
write-output "$($File.Fullname): $(([WMI] "\\$comp\root\CIMV2:CIM_DataFile.Name='$($File.FullName)'").Version)"
}
或者使用单个管道进行操作:
invoke-command -computername $comp {Get-ChildItem C:\Windows\System32\Macromed\Flash\Flash*.ocx||foreach-object {write-output "$($_.Fullname): $(([WMI] "\\$comp\root\CIMV2:CIM_DataFile.Name='$($_.FullName)'").Version)"};
你可以通过在远程计算机本地运行WMI查询来使后者更快(你也可以用第一个来做,但它不是那么漂亮)
invoke-command -computername $comp {Get-ChildItem C:\Windows\System32\Macromed\Flash\Flash*.ocx|foreach-object {write-output "$($_.Fullname): $(([WMI] "\\.\root\CIMV2:CIM_DataFile.Name='$($_.FullName)'").Version)"}};
答案 1 :(得分:0)
Name
的{{1}}属性不能包含通配符。我不相信他们中的任何一个都可以。
但是,您可以指定CIM_DataFile
,Drive
和Path
来获取列表:
Extension
Get-WmiObject -ComputerName $comp -Class CIM_DataFile -Filter "Drive='C:' AND Path='\\Windows\\System32\\Macromed\\Flash\\' AND Extension='ocx'"
的语法有点不稳定。例如,您需要尾部反斜杠。
您还可以通过管道Path
进行进一步过滤:
Where-Object