簡體   English   中英

將對象與 powershell 中的通配符字符串匹配

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM