比较2个数组并保持相似的列

时间:2018-05-15 21:18:25

标签: powershell

我正致力于在Windows 10 PC上使用启动脚本删除默认应用程序。

到目前为止,这是我的脚本:

$RemovalList = @(
    'Microsoft.Messaging'
    'Microsoft.MicrosoftOfficeHub'
    'Microsoft.MicrosoftSolitaireCollection'
    'Microsoft.Office.OneNote'
    'Microsoft.SkypeApp'
    'microsoft.windowscommunicationsapps'
    'Microsoft.XboxApp'
    'Microsoft.XboxGameOverlay'
    'Microsoft.XboxIdentityProvider'
    'Microsoft.XboxSpeechToTextOverlay'
    'Microsoft.ZuneMusic'
    'Microsoft.ZuneVideo'
)

$RemovalList1 = "" | Select DisplayName
$RemovalList1.DisplayName = $RemovalList

$array = @();
$dismRaw = (DISM /Online /Get-ProvisionedAppxPackages)
$PNList =  ($dismRaw | Select-string PackageName) -replace "PackageName : ", ""
$DNList = ($dismRaw | Select-string DisplayName) -replace "DisplayName : ", ""
$Apps = "" | select DisplayName,PackageName
$Apps.DisplayName = $DNList
$Apps.PackageName = $PNList
$array += $Apps

$Apps = $Apps | Where {$_.DisplayName -eq $RemovalList1.DisplayName} #<-- Trying to remove the differences
$Apps.PackageName | % {dism /Online /Remove-ProvisionedAppxPackage /PackageName:$_}

我错过了什么?

我希望$Apps数组删除$RemovalList中的任何内容。然后我想将其传递给命令dism /Online /Remove-ProvisionedAppxPackage /PackageName:$_

更新5/17/2018 更多信息: 如果我使用Remove-ProvisionedAppxPackage,它将删除System,当用户第一次登录系统时,应用程序将无法安装,但cmdlet将无法作为启动。它不会发现它们在那里。使用“dism / Online / Remove-ProvisionedAppxPackage / PackageName:$ _”工作.....我想要2个阵列。首先是$ RemovalList,第二个是$ apps。 $ apps有2列DisplayName和PackageName。我想删除$ apps数组中不在$ RemovalList中的行。

另一个更新5/17/2018 因此,我决定将PackageName与$ Removal List进行比较,而不是比较两个数组并找出两者中没有的数组。它工作但仍然没有得到我的原始问题的答案。 :(哦,它的确有效。

新代码:

$RemovalList=@(
'Microsoft.Messaging'
'Microsoft.MicrosoftOfficeHub'
'Microsoft.MicrosoftSolitaireCollection'
'Microsoft.Office.OneNote'
'Microsoft.SkypeApp'
'microsoft.windowscommunicationsapps'
'Microsoft.XboxApp'
'Microsoft.XboxGameOverlay'
'Microsoft.XboxIdentityProvider'
'Microsoft.XboxSpeechToTextOverlay'
'Microsoft.ZuneMusic'
'Microsoft.ZuneVideo'
)

$dismRaw = (DISM /Online /Get-ProvisionedAppxPackages)
$PNList =  ($dismRaw | Select-string PackageName) -replace "PackageName : ", ""
$AppsToRemove = "" | select PackageName
$AppsToRemove.PackageName = $PNList | where {$RemovalList -contains $(($_).Split("_")[0])}

ForEach ($RemoveApp in $AppsToRemove.PackageName) {
    Write-Output "Removing: $RemoveApp"
    DISM /Online /Remove-ProvisionedAppxPackage /PackageName:$RemoveApp

}  

感谢您的帮助! :)

1 个答案:

答案 0 :(得分:3)

PowerShell具有AppX内容的cmdlet ...您的脚本可以写成:

$RemovalList=@(
'Microsoft.Messaging'
'Microsoft.MicrosoftOfficeHub'
'Microsoft.MicrosoftSolitaireCollection'
'Microsoft.Office.OneNote'
'Microsoft.SkypeApp'
'microsoft.windowscommunicationsapps'
'Microsoft.XboxApp'
'Microsoft.XboxGameOverlay'
'Microsoft.XboxIdentityProvider'
'Microsoft.XboxSpeechToTextOverlay'
'Microsoft.ZuneMusic'
'Microsoft.ZuneVideo'
)

$RemovalList | % {Get-AppxPackage -Name $_} | Remove-AppxPackage -WhatIf

删除-WhatIf以实际删除这些内容。

另请参阅this nice GitHub link以获取更多可以控制您可能不需要的Windows项目的内容。