我对一个流行的 PS 脚本进行了修改,该脚本可以删除基于用户的应用程序。我的脚本使用白名单来确定哪些不能删除。我的白名单如下所示。
store
calc
camera
stickynotes
在 SCCM 任务序列期间调用该脚本来部署机器。这是脚本...
$whitelist = Get-Content -path $PSScriptRoot\whitelist.txt
$AllApps = @(Get-AppxPackage -AllUsers)
$AllProvApps = @(Get-AppxProvisionedPackage -Online)
foreach ($App in $AllApps) {
foreach ($item in $whitelist) {
if ($App.name -like "*$item*") { $App = "" }
}
if ($App -ne "") {Remove-AppxPackage $App}
}
foreach ($ProvApp in $AllProvApps) {
foreach ($item in $whitelist) {
if ($ProvApp.name -like "*$item*") { $ProvApp = "" }
}
if ($ProvApp -ne "") {Remove-AppxProvisionedPackage $ProvApp}
}
结果让我相信它“有点”起作用了...我有一个计算器,但没有别的东西?
答案1
从我的评论来看,这基本上就是你所需要的:
假设的内容whitelist.txt
包含以下内容(正如您在问题中提到的):
store
calc
camera
stickynotes
您需要做的就是:
$whitelist = (Get-Content $PSScriptRoot\whitelist.txt | Where-Object { ![string]::IsNullOrWhiteSpace($_) }) -join '|'
Get-AppxPackage -AllUsers | Where-Object { $_.Name -notmatch $whitelist } | Remove-AppxPackage
Get-AppxProvisionedPackage -Online | Where-Object { $_.DisplayName -notmatch $whitelist } | Remove-AppxProvisionedPackage
解释:
- 我们获取非空或空格的文件内容,并将其连接在一起以
|
创建正则表达式字符串 - 我们获取所有
AppxPackages
不AppxProvisionedPackages
匹配正则表达式的,并删除它们
答案2
你的脚本是错误的,其中的错误让人难以理解。但我猜到了你最终想要做什么,你试图卸载所有未列入白名单的应用程序,这很简单,我已经修复了你的代码,现在它可以正常工作了:
[string[]]$whitelist = Get-Content -path $PSScriptRoot\whitelist.txt
$AllApps = @(Get-AppxPackage -AllUsers)
$AllProvApps = @(Get-AppxProvisionedPackage -Online)
foreach ($App in $AllApps) {
if ($whitelist -notcontains $App.packagefullname) {Remove-AppxPackage $App}
}
foreach ($ProvApp in $AllProvApps) {
if ($whitelist -notcontains $ProvApp.packagename) {Remove-AppxProvisionedPackage $ProvApp}
}
由于 Get-Content 默认将每一行作为单独的字符串返回,使用 [string[]] 将创建一个 [array],其中每一行作为 [string] 元素,然后可以轻松使用 -contains 和 -notcontains 运算符检查包含条件,运算符的结果是布尔值(true 或 false)。
if 条件表示该应用程序不包含在白名单中。
更新
仅当提供应用程序的全名时,上述代码才会起作用,要获取全名,请运行Get-AppxPackage -AllUsers
以获取所有应用程序,这是一个很长的列表,因此最好将输出重定向到文件:
Get-AppxPackage -AllUsers | Out-File "C:\path\to\text\file.txt"
您还可以通过以下方式进行过滤,使其仅输出应用程序的全名:
(Get-AppxPackage -AllUsers).packagefullname
对于已配置的 appx 包,请使用以下命令:
Get-AppxProvisionedPackage -Online
输出到控制台
(Get-AppxProvisionedPackage -Online).PackageName
仅显示包名称
Get-AppxProvisionedPackage -Online | Out-File "C:\path\to\file.txt"
将输出重定向到文本文件。
但最好使用这个:
Get-AppxProvisionedPackage -Online | Export-Csv "C:\Path\To\File.csv"
将其导出为 csv 文件,以便下次在 PowerShell 中使用它,只需执行以下操作:
$csv=Import-Csv "C:\Path\To\File.csv"
完整代码:
[string[]]$whitelist = get-content -path $psscriptroot\whitelist.txt
[array]$apps=(get-appxpackage -allusers).packagefullname
[array]$provapps=(get-appxprovisionedpackage -online).packagename
$approved=@()
foreach ($item in $whitelist) {
foreach ($app in $apps) {
if ($app -match $item -and $approved -notcontains $app) {$approved+=$app}
}
foreach ($provapp in $provapps) {
if ($provapp -match $item -and $approved -notcontains $provapp) {$approved+=$provapp}
}
}
$whitelist=$approved
foreach ($app in $apps) {
if ($whitelist -notcontains $app) {remove-appxpackage -package $app -allusers}
}
foreach ($provapp in $provapps) {
if ($whitelist -notcontains $provapp) {remove-appxprovisionedpackage -online -packagename $provapp}
}
答案3
是的,我知道这很脏,但它帮我解决了问题!
where-object {($_.name –notlike “*store*”) -and ($_.name –notlike "*Calc*") -and ($_.name –notlike "*Camera*")
我喜欢 Xeнεi Ξэnвϵς 的建议,但我认为我遇到了白名单路径问题,导致所有内容都被卸载。当我有更多时间时,我会重新考虑它。