You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过PowerShell筛选精确匹配名称的Shared Drive ID(GAM不可改)

解决GAM共享盘名称精确匹配筛选问题

问题背景

使用GAM命令查询共享盘时,matchname参数会返回所有名称包含目标字符串的结果(例如查询"House"会返回"HouseFire"、"House Boat"),且无法修改GAM命令,需通过PowerShell后续处理实现精确名称匹配。

失败方法分析

  1. 同时匹配名称与ID行:

    Where-Object {$_ -match $SName -and $_ -match "Shared Drive ID: " }
    

    无返回结果,因为Shared Drive ID:行本身不包含共享盘名称,没有行能同时满足两个匹配条件。

  2. 仅匹配包含目标名称的行:

    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

原理说明

  1. 分组:GAM输出中每个共享盘的信息是连续的文本块,以Shared Drive Name:开头,通过遍历将这些块单独拆分。
  2. 精确匹配:对比每个块的名称与目标名称(完全相等),而非包含关系。
  3. 提取ID:找到匹配的块后,从该块中提取对应的ID行内容。

内容的提问来源于stack exchange,提问作者dcaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 13:35:22