我正在使用PS V3.0检查Google Chrome版本:
get-content -Path C:\Support\assets.txt | ForEach-Object ({get-wmiobject win32_product -ComputerName $_ | where-Object {$_.name -eq "google chrome"} |FT version})
{write-host "$_"}
txt文件内部是远程设备的IP地址。
该命令工作正常,并为我提供Chrome版本,但我不能在循环中包含IP地址。
它只给我一个chrome版本,没有关于它来自哪个远程设备的信息。我想得到这样的东西:
IP address - Chrome version IP address - Chrome version
据我了解,这应该是Foreach (action){do something}
?
也有机会删除#34;版本"从输入?
答案 0 :(得分:2)
好的,你已经犯了一些非常无辜的初学者类型错误,但这很容易解决。
让我们从ft
开始。 ft
是Format-Table
的缩写。一般来说,在尝试输出内容时,只使用Format-
命令。您正在尝试使用该结果,而不是输出它,因此我们需要删除ft
。而是使用Select-Object
cmdlet(或更常用的是较短的select
)。
get-content -Path C:\Support\assets.txt | ForEach-Object ({get-wmiobject win32_product -ComputerName $_ | where-Object {$_.name -eq "google chrome"} |Select version})
好的,它会为您提供仅具有Version
属性的对象数组。不是非常有用,特别是当你想知道每个与之相关的计算机时!所以,这是一个很好的教训,但在这里不太实用。让我们继续前进,让事情变得更好!
通过将事物传递到像这样的ForEach
循环,你正在使事情变得更加困难。您正在针对每个IP地址进行单独的Get-WMIObject
次呼叫。如果我们查看get-help get-wmiobject -parameter computername
,我们可以看到它接受一个字符串数组。所以我们可以针对多个目标进行1次调用,这有助于加快速度。
$IPList = get-content -Path C:\Support\assets.txt
Get-WMIObject win32_product -ComputerName $IPList | Where{$_.Name -eq 'Google Chrome'}
这应该可以加快您的搜索结果,但是如果使用Get-WMIObject
的{{1}}参数代替-Filter
,那么使事情变得更快的是什么。原因是提供者更有效地过滤自己的对象,并返回你想要的东西,而不是PowerShell过滤东西。此外,这会减少从远程计算机发回的数据,因此您只需从中获取所需数据,而不是每台计算机可能获得数百个结果,然后再解析为您想要的数据。基本上你拥有所有的电脑'处理你的问题的处理器,而不仅仅是你的。因此,让我们使用Where
参数:
-Filter
好的,现在应该恢复得更快。因此,直到最后一项,您需要计算机名称以找到每个版本的内容。好消息,你已经拥有它了!好吧,我们有计算机的实际名称,而不是您指定的IP地址。默认情况下不显示它,但这些结果中的每一个都有一个$IPList = get-content -Path C:\Support\assets.txt
Get-WMIObject win32_product -ComputerName $IPList -Filter "Name='Google Chrome'"
属性,您可以参考。我们可以直接导管到PSComputerName
并指定我们想要的属性:
Select
这可能会让你得到满意的结果。如果没有,您可以通过$IPList = get-content -Path C:\Support\assets.txt
Get-WMIObject win32_product -ComputerName $IPList -Filter "Name='Google Chrome'" | Select PSComputerName,Version
循环运行它,与您的方式类似,并按照您指定的格式进行格式化:
ForEach