为什么powershell将我的哈希表转换为字符串块

时间:2016-03-17 09:08:10

标签: powershell hashtable key-value

我有一个哈希表($applications),看起来像这样:

Name                                                        Version
----                                                        -------
Adobe Flash Player 19 ActiveX                               19.0.0.226
Enterprise Library 4.0 - May 2008                           4.0.0.0
Entity Framework Designer for Visual Studio 2012 - enu      11.1.21009.00
Fiddler                                                     2.4.0.6
Google Chrome                                               49.0.2623.87
IIS 8.0 Express                                             8.0.1557

所以我试图从列表中排除某些应用程序,并且我正在使用:

[array]$excludeApps = "Fiddler","Chrome"
foreach ($excludeApp in $excludeApps){
    $applications = $applications -notlike "*$excludeApp*"
}

结果可能会从排除列表中滤除,但不符合我的预期:

@{Name=Adobe Flash Player 19 ActiveX; Version=19.0.0.226}
@{Name=Enterprise Library 4.0 - May 2008; Version=4.0.0.0}
@{Name=Entity Framework Designer for Visual Studio 2012 - enu; Version=11.1.21009.00}
@{Name=IIS 8.0 Express; Version=8.0.1557}

我尝试使用GetEnumerator()${applications.Name}的几种语法处理这些值,但没有任何工作。我相信PowerShell会将此列表检测为字符串。

知道怎么处理这个吗?

2 个答案:

答案 0 :(得分:1)

将select-object与-match/-notmatch运算符一起使用。

即:

$application = $application | ? { $_.name -notmatch "fiddler" -or $_.name -notmatch "Chrome"}

或在循环中:

[array]$excludeApps = "Fiddler","Chrome"
foreach ($excludeApp in $excludeApps){
    $applications = $applications | ? {$_.name -notmatch $excludeApp }
}

答案 1 :(得分:0)

首先,您的数据不是哈希表,而是自定义对象列表,可能来自导入CSV。如果要通过其中一个属性(Fiddler)上的部分匹配(ChromeName)列表过滤这些对象,最好的方法是构建正则表达式:

$excludeApps = 'Fiddler', 'Chrome'
$expr = @($excludeApps | ForEach-Object { [regex]::Escape($_) }) -join '|'

然后在-notmatch语句中使用Where-Object条件过滤列表:

$applications | Where-Object { $_.Name -notmatch $expr }