如何在Powershell管道中使用外部文件(如.txt)中的区块列表进行筛选

如何在Powershell管道中使用外部文件(如.txt)中的区块列表进行筛选,powershell,Powershell,我需要一个Powershellscript,它可以读取所有安装的程序,过滤它们并将它们放入.txt文件中。 我得到了基本功能,但我想通过使用区块列表过滤掉某些程序来增强脚本。我在下面的第一次尝试使用了我必须在脚本中声明的变量,我真的不喜欢这样。这些变量阻止了一些具有相同开始的条目,但我想阻止更多具有随机名称的条目,我想使用一个单独的.txt文件作为阻止列表。 我已经准备好使用Get Content从文件中导入字符串,我相信在那里我得到了一个数组变量,但从那里开始我不知道该怎么做,我尝试的每件事都

我需要一个Powershellscript,它可以读取所有安装的程序,过滤它们并将它们放入.txt文件中。 我得到了基本功能,但我想通过使用区块列表过滤掉某些程序来增强脚本。我在下面的第一次尝试使用了我必须在脚本中声明的变量,我真的不喜欢这样。这些变量阻止了一些具有相同开始的条目,但我想阻止更多具有随机名称的条目,我想使用一个单独的.txt文件作为阻止列表。 我已经准备好使用Get Content从文件中导入字符串,我相信在那里我得到了一个数组变量,但从那里开始我不知道该怎么做,我尝试的每件事都不起作用

这是我的封锁名单:

微软Visual C++ 微软.NET vs_ Microsoft Windows桌面运行时 英伟达 Microsoft ASP.NET 工具包文档
Microsoft TestPlatform SDK本地源
amd64上的Windows系统映像管理器
Windows PE x86 x64 wims
Windows PE x86 x64
Windows部署工具
Windows部署自定义设置
套件配置安装程序
用户状态迁移工具
VS沉浸式激活助手
Microsoft XNA Framework可再发行版3.1
Microsoft XNA Framework可再发行4.0刷新

这就是我到目前为止得到的代码:

$ignore1="Microsoft Visual C++"; $ignore2="Microsoft .NET"; $ignore3="vs_"; $ignore4="Microsoft Windows Desktop Runtime"; $ignore5="NVIDIA"; $ignore6="Microsoft ASP.NET"
$Outputfile="C:\...\temp\test.txt"
$Filterfile="C:\...\Skripts\Funktionen\blocklist.txt"

$List64 = Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*    | Select-Object DisplayName, Publisher, DisplayVersion, InstallDate 
$List32 = Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*                | Select-Object DisplayName, Publisher, DisplayVersion, InstallDate
$List = $List64 + $List32
$filters = Get-Content $filterFile

$List | Where-Object DisplayName | 
    Where-Object {($_.DisplayName -notlike "$ignore1*") -and ($_.DisplayName -notlike "$ignore2*") -and ($_.DisplayName -notlike "$ignore3*") -and ($_.DisplayName -notlike "$ignore4*") -and ($_.DisplayName -notlike "$ignore5*") -and ($_.DisplayName -notlike "$ignore6*")} |
     Where-Object DisplayName | Sort-Object -Property Publisher | Format-Table > $Outputfile

从PowerShell 7.2开始,没有直接的方法可以将字符串与模式数组进行匹配—既不能使用
-match
(正则表达式)也不能使用(通配符表达式)

  • 有一个绿灯亮起但尚未实施的提案,建议引入对
    -like
    (及其否定形式
    -notlike
    )的支持,请参阅

  • 两个旁白:

    • 如果要搜索字符串,cmdlet确实支持多个正则表达式模式/文字子字符串参数

    • 通过或其操作数反转变量,已支持将整个文字字符串与数组匹配

目前,您最好的选择是构造一个与您的多个
-like
操作等效的单操作,并将其与
-notmatch
一起使用,后者是
-match
的否定形式,即:


多亏了@mklement0,它现在可以工作了。我在某个地方有一个文件来定义过滤器,在这种情况下,我不需要在最后的列表中列出程序

$Outputfile="C:\__Somewhere__\temp\test.txt"
$filters = Get-Content "C:\__Somewhere__\filterfile.txt"

$filter = '^(' + ($filters.ForEach({ [regex]::Escape($_) }) -join '|') + ')'

$List64 = Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*    | Select-Object DisplayName, Publisher, DisplayVersion, InstallDate 
$List32 = Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*                | Select-Object DisplayName, Publisher, DisplayVersion, InstallDate
$List = $List64 + $List32

$List | Where-Object DisplayName | Where-Object DisplayName -notmatch $filter | Sort-Object -Property Publisher > $Outputfile
$Outputfile="C:\__Somewhere__\temp\test.txt"
$filters = Get-Content "C:\__Somewhere__\filterfile.txt"

$filter = '^(' + ($filters.ForEach({ [regex]::Escape($_) }) -join '|') + ')'

$List64 = Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*    | Select-Object DisplayName, Publisher, DisplayVersion, InstallDate 
$List32 = Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*                | Select-Object DisplayName, Publisher, DisplayVersion, InstallDate
$List = $List64 + $List32

$List | Where-Object DisplayName | Where-Object DisplayName -notmatch $filter | Sort-Object -Property Publisher > $Outputfile