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