Powershell数组键

Rob*_*ith 0 arrays powershell

Powershell中的键控数组

我发现2015年这个旧的PowerShell文件删除了无用的Windows 10应用程序.很有用.但是出于代码压缩的原因,我发现它是这样编写的,我知道这只是浪费重复的语句:

Write-Host -NoNewline "Removing Candy Crush App..." -ForegroundColor White
Get-AppxPackage -AllUsers | Where-Object {$_.Name -like "king.com*"} | $
Write-Host "DONE" -ForegroundColor Green
Write-Host -Nonewline "Removing Twitter App..." -ForegroundColor White
Get-AppxPackage -AllUsers | Where-Object {$_.Name -like "*Twitter"} | Remove-AppxPackage
Write-Host "DONE" -ForegroundColor Green
Write-Host -Nonewline "Removing Facebook App..." -ForegroundColor White
Get-AppxPackage -AllUsers | Where-Object {$_.Name -like "*Facebook"} | Remove-AppxPackage
Write-Host "DONE" -ForegroundColor Green

...

# News / Sports / Weather
If ($App.DisplayName -eq "Microsoft.BingFinance")
{
    Write-Host -NoNewline "Removing Finance App..." -ForegroundColor Yellow
    Remove-AppxProvisionedPackage -Online -PackageName $App.PackageName | Out-Null
    Remove-AppxPackage -Package $App.PackageName | Out-Null
    Write-Host "DONE" -ForegroundColor Green
}

If ($App.DisplayName -eq "Microsoft.BingNews")
{
    Write-Host -NoNewline "Removing News App..." -ForegroundColor Yellow
    Remove-AppxProvisionedPackage -Online -PackageName $App.PackageName | Out-Null
    Remove-AppxPackage -Package $App.PackageName | Out-Null
    Write-Host "DONE" -ForegroundColor Green
}

...
Run Code Online (Sandbox Code Playgroud)

我的想法:将每个应用程序及其显示的状态消息存储在每个应用程序中Write-Host作为键控数组自动存储,例如:

$Apps (
  [0] (
    [string]$StatusMessage = "Removing Candy Crush App...",
    [object]$AppObject = object
    [string]$AppType = "allusers"
   )

  ...

  [7] (
    [string]$StatusMessage = "Removing Bing News app..."
    [object]$AppObject = object
    [string]$AppType = "provisioned"
  )
  [8] (
    [string]$StatusMessage = "Removing Bing Finance app..."
    [object]$AppObject = object
    [string]$AppType = "provisioned"
  )

  ...
)
Run Code Online (Sandbox Code Playgroud)

我们的配置中的"黑名单",我想与之匹配$Apps[key].AppOject.Name:

$Blacklist (
  "king.com",
  "*Twitter",
  "*Facebook",
  "Microsoft.BingFinance",
  "Microsoft.BingNews",
  ...
)
Run Code Online (Sandbox Code Playgroud)

这样我就可以在一个简单的处理For Each $Apps as $App它,如果它需要删除作为配置的应用程序而不是常规的用户应用程序,并输出辉煌的过程作为用户的漂亮的自定义ANSI栏,因为我们有一个键控数组到与一些实际存在的应用程序相关,这些应用程序绝对会与我们的黑名单相匹配.:-)

如何将我们的应用程序数组存储在这样的键控数组中,这样我就可以轻松地在一个字符串中进行匹配For Each $Apps as $App来正确处理每个应用程序?

The*_*ian 6

你想要的是哈希表.使用哈希表,您可以定义键和关联值.为了您的目的,我将为每个值创建一个PSCustomObject.像这样的东西:

$Apps = Get-AppxPackage -AllUsers
$Apps += Get-AppxProvisionedPackage -Online
$AppHash = @{
    'king.com' =          [pscustomobject]@{
                              'StatusMessage' = "Removing Candy Crush App..."
                              'AppObject' = $Apps | Where{$_.Name -like 'king.com*'}
                              'AppType' = 'AllUsers'
                          }
    'Microsoft.BingNews' = [pscustomobject]@{
                              'StatusMessage' = "Removing Candy Crush App..."
                              'AppObject' = $Apps | Where{$_.Name -like 'king.com*'}
                              'AppType' = 'Provisioned'
                          }
}
Run Code Online (Sandbox Code Playgroud)

然后你就像你描述的那样打电话:

Write-Host $AppHash['king.com'].StatusMessage
$AppHash['king.com'].AppObject | Remove-AppxPackage
Run Code Online (Sandbox Code Playgroud)

你需要在那里写一些逻辑来处理配置的东西,但这应该适合你所描述的需求.