我一直在编写一个简单的脚本来读取远程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 过滤器的事情......
感谢您的帮助......
答案 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。