好吧,你已經做出了一些非常天真的初學者類型的錯誤,但這很容易解決。
讓我們從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
的-Filter
參數,而不是Where
。原因在於提供程序在過濾自己的對象方面更加高效,並且只是以您想要的方式返回,而不像PowerShell那樣過濾事物。而且,這會減少從遠程計算機發回的數據,因此您只能從中獲取所需的數據,而不是每臺計算機可能獲得的數百個結果,然後解析爲您想要的數據。基本上你有所有的計算機處理器在處理你的問題,而不僅僅是你的問題。因此,讓我們使用-Filter
參數:
$IPList = get-content -Path C:\Support\assets.txt
Get-WMIObject win32_product -ComputerName $IPList -Filter "Name='Google Chrome'"
好了,事情應該回來一大堆快。因此,直到最後一個項目,您需要爲每個版本的計算機名稱。好消息,你已經擁有它了!那麼,我們有計算機的實際名稱,而不是您指定的IP地址。它不會默認顯示,但每個結果都有一個PSComputerName
屬性,您可以參考。我們可以簡單地管Select
,並指定了我們需要的屬性:
$IPList = get-content -Path C:\Support\assets.txt
Get-WMIObject win32_product -ComputerName $IPList -Filter "Name='Google Chrome'" | Select PSComputerName,Version
這可能會得到你的結果你滿意。如果沒有,你可以通過一個ForEach
循環同樣運行它你怎麼樣,像你指定的格式是:
$IPList = get-content -Path C:\Support\assets.txt
ForEach($IP in $IPList){
$Version = Get-WMIObject win32_product -ComputerName $IP -Filter "Name='Google Chrome'" | Select -Expand Version
"$IP - $Version"
}
噢,這就是我所需要的!我沒有想到這麼多細節。你給了我真正的教訓。非常感謝你。祝福你! –