[英]Match objects to wildcarded strings in powershell
編寫腳本以擺脫某些 Windows 10 膨脹軟件並遇到一些問題。
目的是在繼續之前檢查應用程序是否存在並使用 Remove-AppXPackage 將其刪除。 我將所有名稱添加到字符串數組中,兩邊都帶有星號和星號,但是在 if 語句中使用 -like 或 -match 時無法匹配。
我寫了下面的代碼,試圖讓它完全按照以下命令工作:
Get-AppxPackage *windowsalarms* | Remove-AppxPackage
但相反,首先檢查該包是否存在。 我假設原始命令是相互匹配對象。 而且我意識到我正在嘗試將一個對象與字符串進行比較......那么我應該為每個對象創建一個只有一個 name 屬性的對象數組,然后嘗試比較它們嗎?
$AppsToRemove = @("*broker*"
,"3dbuilder"
,"windowsalarms"
,"officehub"
,"skypeapp"
,"getstarted"
,"zunemusic"
,"solitarecollection"
,"bingfinance"
,"zunevideo"
,"bingnews"
,"windowsphone"
,"bingsports"
,"xboxapp"
,"whiteboard"
,"sway"
,"todos"
,"lens"
,"soundrecorder"
,"onenote"
,"remotedesktop"
,"networkspeedtest")
Get-AppxPackage | ForEach-Object {
$Placeholder = $_.Name
Foreach ($app in $AppsToRemove){
If ($app -like $Placeholder) {
Write-Host "Match"
}else{
Write-Host "No match"
}
}
}
嘗試這樣的事情,將數組連接到 [Regex] 對象中。 然后我獲取了所有 AppXPackages 並將其通過管道傳輸到 Where-Object 以判斷它們是否與原始數組匹配。 我在最后添加了一個-WhatIf
進行測試。 當您想要實際運行腳本以刪除它們時,可以將其刪除。
[Regex] $AppsToRemove = @(
'broker'
'3dbuilder'
'windowsalarms'
'officehub'
'skypeapp'
'getstarted'
'zunemusic'
'solitarecollection'
'bingfinance'
'zunevideo'
'bingnews'
'windowsphone'
'bingsports'
'xboxapp'
'whiteboard'
'sway'
'todos'
'lens'
'soundrecorder'
'onenote'
'remotedesktop'
'networkspeedtest'
) -join '|'
Get-AppxPackage | Where-Object -Property Name -Match -Value $AppsToRemove | Remove-AppxPackage -Verbose -WhatIf
鑒於其中一些已在我的機器上刪除,我得到以下輸出:
What if: Performing the operation "Remove package" on target "Microsoft.AAD.BrokerPlugin_1000.16299.15.0_neutral_neutral_cw5n1h2txyewy".
What if: Performing the operation "Remove package" on target "Microsoft.WindowsAlarms_10.1804.1101.1000_x64__8wekyb3d8bbwe".
What if: Performing the operation "Remove package" on target "Microsoft.WindowsSoundRecorder_10.1804.911.1000_x64__8wekyb3d8bbwe".
What if: Performing the operation "Remove package" on target "Microsoft.ZuneVideo_10.18082.10311.0_x64__8wekyb3d8bbwe".
What if: Performing the operation "Remove package" on target "Microsoft.ZuneMusic_10.18091.10321.0_x64__8wekyb3d8bbwe".
@ShawnEsterman 的回答引導我想到了一個我更熟悉的想法,我想出了以下可行的方法:
$i = 0
$AppsToRemove = @("broker"
,"3dbuilder"
,"windowsalarms"
,"officehub"
,"skypeapp"
,"getstarted"
,"zunemusic"
,"solitarecollection"
,"bingfinance"
,"zunevideo"
,"bingnews"
,"windowsphone"
,"bingsports"
,"xboxapp"
,"whiteboard"
,"sway"
,"todos"
,"lens"
,"soundrecorder"
,"onenote"
,"remotedesktop"
,"networkspeedtest")
$Packages = Get-AppxPackage | ForEach-Object {
Foreach ($App in $AppsToRemove){
if($_ -match $App){
Remove-AppxPackage $_
}
}
}
感謝肖恩的指導!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.