查询帮助 - wmiobject win32_product过滤文本文件中的项目

时间:2013-03-12 18:24:17

标签: powershell installed-applications

我一直在编写一个简单的脚本来读取远程PC上的win32_product,这个工作正常。但是,我希望查询忽略我的域上的一些常见应用程序。我一直在构建应用程序列表及其IdentifyingNumber,并将IdentifyingNumber放入txt文件中。我将文本文件加载到一个带有脚本的变量中,我试图弄清楚如何让查询过滤变量中的每个项目...所以我有这个::

$PC = Read-Host "What is target workstation..."
$logfile = "d:\$PC.txt"
$ignore = [IO.File]::ReadAllText("D:\INCOMING\AppListing\ignore.txt")
get-wmiobject -class win32_product -computer $PC | where {$_.IdentifyingNumber -notlike       $ignore} | Select Name, IdentifyingNumber | sort-object Name | export-csv $logfile -encoding "unicode"

但是,这根本不是过滤,甚至不是txt文件中的第一个或最后一个项目。我使用write-host $ ignore来验证它是否正在加载项目...但我对于如何使这项工作感到迷茫。也许是一个foreach循环?我找不到任何关于将foreach循环放入 where 过滤器的事情......

感谢您的帮助......

2 个答案:

答案 0 :(得分:0)

如果文件是这样的:

aRandomId
anotherRandonId
...

每行都有一个id而不是其他内容,然后使用带有通配符的-notlike尝试此操作。例如:

$PC = Read-Host "What is target workstation..."
$logfile = "d:\$PC.txt"
$ignore = [IO.File]::ReadAllText("D:\INCOMING\AppListing\ignore.txt")
get-wmiobject -class win32_product -computer $PC | where { $ignore -notlike "*$($_.identifyingnumber)*" } |
Select Name, IdentifyingNumber | sort-object Name | export-csv $logfile -encoding "unicode"

您还可以使用ReadAllLines将文件读取为数组,就像您希望使用foreach-loop或-notcontains一样。例如:

$PC = Read-Host "What is target workstation..."
$logfile = "d:\$PC.txt"
$ignore = [IO.File]::ReadAllLines("D:\INCOMING\AppListing\ignore.txt")
get-wmiobject -class win32_product -computer $PC | where { $ignore -notcontains $_.identifyingnumber } |
Select Name, IdentifyingNumber | sort-object Name | export-csv $logfile -encoding "unicode"

答案 1 :(得分:0)

$prods = Compare-Object -ReferenceObject (Get-Content $file) -DifferenceObject ((Get-WmiObject -Class Win32_Product -Computer $computer).IdentifyingNumber) -PassThru

Compare-Object是一个很棒的Cmdlet。