我有一个哈希表($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会将此列表检测为字符串。
知道怎么处理这个吗?
答案 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
)上的部分匹配(Chrome
,Name
)列表过滤这些对象,最好的方法是构建正则表达式:
$excludeApps = 'Fiddler', 'Chrome'
$expr = @($excludeApps | ForEach-Object { [regex]::Escape($_) }) -join '|'
然后在-notmatch
语句中使用Where-Object
条件过滤列表:
$applications | Where-Object { $_.Name -notmatch $expr }