按名称从列表文件中过滤包

时间:2017-03-10 13:13:49

标签: file powershell filter conditional-statements

我正在尝试从文件中读取程序名称以过滤掉已安装的程序名称。 为了阅读我得到的文件:  $file = Get-Content "C:\Users\testuser\Desktop\Test.txt"
然后我尝试按照他们的名字过滤包,这不起作用,我尝试了:

Get-AppxPackage | Where-Object -Property Name -notin $file | select Name, IsFramework

Get-AppxPackage | Where-Object { $_.Name -notin $file } | select Name, IsFramework

我不能使用任何.Net语句,我该如何解决?

修改:这是我文件的内容:

Microsoft.BioEnrollment Microsoft.AAD.BrokerPlugin Microsoft.Windows.CloudExperienceHost Microsoft.Windows.ShellExperienceHost windows.immersivecontrolpanel Microsoft.Windows.Cortana Microsoft.AccountsControl Microsoft.LockApp

1 个答案:

答案 0 :(得分:0)

仅从David Brabant进行回顾,以下内容适用于askingQuestions

Get-AppxPackage | ?{ $file.Contains($_.Name) } | select Name, IsFramework

这很好用,可能是执行此操作的最佳方法之一。


这不适用于我所有应用程序,因此这是过滤列表的另一种方法。 :)

匹配名称:

Get-WmiObject -Class Win32_Product | Where-Object {$_.name -Like "appName"}

不匹配的名称:

Get-WmiObject -Class Win32_Product | Where-Object {$_.name -NotMatch "appName"}

请注意,使用Where-Object不区分大小写,而是查找完全匹配。另一方面,您也可以使用通配符。

但是要按文件过滤,您可以执行以下操作:

[string[]]$List = (Get-Content -Path 'C:\test.txt') -replace ' ',"`r`n"
 foreach ($ProgramName in $List)
 {
 Get-WmiObject -Class Win32_Product | Where-Object {$_.name -Like $ProgramName}
 }

请注意,-replace ' '," r n"仅对于应用程序名称之间的空格是必需的。您只需删除它,然后将每个应用程序放在新的一行即可。另外请注意,这可能会产生重复。

通配符示例:

Get-WmiObject -Class Win32_Product | Where-Object {$_.name -Like "*adobe*"}

干杯!