如何通过PowerShell筛选精确匹配名称的Shared Drive ID(GAM不可改)
解决GAM共享盘名称精确匹配筛选问题
问题背景
使用GAM命令查询共享盘时,matchname参数会返回所有名称包含目标字符串的结果(例如查询"House"会返回"HouseFire"、"House Boat"),且无法修改GAM命令,需通过PowerShell后续处理实现精确名称匹配。
失败方法分析
同时匹配名称与ID行:
Where-Object {$_ -match $SName -and $_ -match "Shared Drive ID: " }无返回结果,因为
Shared Drive ID:行本身不包含共享盘名称,没有行能同时满足两个匹配条件。仅匹配包含目标名称的行:
Where-Object {$_ -match $SName }仍返回多个结果,因为相似名称(如"HouseFire")的名称行也包含"House"字符串。
解决方案
将GAM输出按单个共享盘的信息块分组,先筛选出名称精确匹配的块,再从中提取ID:
# 获取GAM原始输出 $gamOutput = & gam user $EMAIL show teamdrives matchname $SharedName # 按共享盘分组(每个共享盘以"Shared Drive Name:"开头) $driveBlocks = @() $currentBlock = @() foreach ($line in $gamOutput) { if ($line -match '^Shared Drive Name: ') { if ($currentBlock) { $driveBlocks += ,$currentBlock $currentBlock = @() } } $currentBlock += $line } if ($currentBlock) { $driveBlocks += ,$currentBlock } # 精确匹配名称并提取ID $targetName = $SName # 替换为你的目标共享盘名称 $targetID = $null foreach ($block in $driveBlocks) { # 提取当前块的共享盘名称 if ($block | Where-Object { $_ -match '^Shared Drive Name: (.+)' }) { $currentName = $matches[1].Trim() if ($currentName -eq $targetName) { # 提取该块的ID $block | Where-Object { $_ -match 'Shared Drive ID: (.+)' } | Out-Null $targetID = $matches[1].Trim() break # 找到目标后停止遍历 } } } # 输出结果 $targetID
原理说明
- 分组:GAM输出中每个共享盘的信息是连续的文本块,以
Shared Drive Name:开头,通过遍历将这些块单独拆分。 - 精确匹配:对比每个块的名称与目标名称(完全相等),而非包含关系。
- 提取ID:找到匹配的块后,从该块中提取对应的ID行内容。
内容的提问来源于stack exchange,提问作者dcaz
相关产品推荐
相关产品推荐

