PowerShell数组过滤问题:移除指定元素及Master/Develop项
问题需求与解决方案
需求说明
我有两个数组:
$array1:存储Docker容器及镜像名称$array2:存储Azure DevOps活跃拉取请求编号
需要实现:
- 移除
$array1中包含$array2里任意编号的元素 - 同时必须移除所有包含
Master或Develop的元素
当前尝试的代码
$array1 = docker ps -a --no-trunc -f name=myWEAPS* | ForEach-Object { "$(($_ -split '\s+',25)[1,-1])" } $array1 = $dockerCons[1..($dockerCons.Length - 1)] $array1 = 'myserver:1517 myserver7998', 'myserver:1515 myserver7990', 'myserver:1514 myserver7999', 'myserver:Master', 'myserverS8003', 'myserver:Develop myserver8002' $array2 = '1517' , '1518' $reg = [regex] '[7][0-9][0-9][0-9]' foreach ($dockerCon in $array1) { #Write-Host $dockerCon -ForegroundColor Gray if ($array2 -notcontains $dockerCon -and $dockerCon -match $reg) { Write-Host "`t"$dockerCon -ForegroundColor Red } }
原代码的问题
- 匹配逻辑错误:
$array2 -notcontains $dockerCon是全字符串匹配,但$array2里是短编号(比如1517),而$array1的元素是长名称,根本无法匹配,导致无法过滤掉含目标编号的项 - 未处理Master/Develop过滤:代码里完全没加移除含
Master或Develop元素的判断 - 正则匹配冗余:需求里没要求只保留含7开头四位数字的项,这个正则是多余的限制
修正后的代码
# 示例数据 $array1 = 'myserver:1517 myserver7998', 'myserver:1515 myserver7990', 'myserver:1514 myserver7999', 'myserver:Master', 'myserverS8003', 'myserver:Develop myserver8002' $array2 = '1517' , '1518' # 第一步:过滤掉含Master或Develop的项 $filteredArray = $array1 | Where-Object { $_ -notmatch 'Master|Develop' } # 第二步:过滤掉包含$array2中任意编号的项 $filteredArray = $filteredArray | Where-Object { $item = $_ # 检查当前项是否包含$array2里的任何一个编号 -not ($array2 | Where-Object { $item -match $_ }) } # 输出结果 $filteredArray | ForEach-Object { Write-Host "`t$_" -ForegroundColor Red }
代码说明
- 过滤Master/Develop:用
-notmatch 'Master|Develop'直接排除包含这两个关键词的元素 - 过滤PR编号:对每个剩余元素,检查是否包含
$array2中的任意编号,用-not反向保留不包含的项 - 如果是从
docker ps获取原始数据,替换示例的$array1赋值即可:
# 从Docker获取容器名称的正确写法(修正原代码里的变量名错误:$dockerCons应该是$array1) $array1 = docker ps -a --no-trunc -f name=myWEAPS* | ForEach-Object { ($_ -split '\s+',25)[1,-1] } # 跳过表头行 $array1 = $array1[1..($array1.Length - 1)]
内容的提问来源于stack exchange,提问作者JJPSKI
相关产品推荐
相关产品推荐

