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

如何用PowerShell批量映射22个DFS共享并循环获取容量?

批量处理DFS共享容量统计的PowerShell解决方案

核心思路

我给你梳理一个高效的实现方案,完美适配你的需求——把CSV里的共享路径按22个一组拆分,每组对应E到Z的驱动器号,完成映射→统计容量→解绑驱动器的循环流程,直到处理完前2500个路径。整个过程会自动处理分组、驱动器分配、异常捕获,最后把所有统计结果导出到CSV。

完整实现代码

# 配置参数,根据你的实际情况修改
$csvPath = "你的CSV文件路径"
$outputCsvPath = "DFS共享容量统计结果.csv"
$batchSize = 22  # 每批映射的共享数量(E-Z共22个驱动器号)
$maxProcessCount = 2500  # 只处理前2500个共享路径

# 读取CSV并截取前2500条数据
$csvData = Import-Csv -Path $csvPath | Select-Object -First $maxProcessCount

# 初始化结果存储数组
$results = @()

# 生成E到Z的驱动器号数组
$driveLetters = 'E'..'Z'

# 按22个一组自动分组
$groups = $csvData | Group-Object -Property { [math]::Floor($script:i++ / $batchSize) }

# 遍历每一组进行处理
foreach ($group in $groups) {
    Write-Host "正在处理第 $($group.Name) 组,共 $($group.Count) 个共享..."
    
    # 将当前组的共享路径与驱动器号一一配对
    $pairedItems = $group.Group | Select-Object @{Name='DriveLetter'; Expression={$driveLetters[$_]}}, * -Index 0..($group.Count-1)
    
    # 逐个映射驱动器并统计容量
    foreach ($item in $pairedItems) {
        try {
            # 映射DFS共享为网络驱动器
            New-PSDrive -Name $item.DriveLetter -PSProvider FileSystem -Root $item.Name -ErrorAction Stop | Out-Null
            
            # 获取驱动器容量信息(结合Get-Volume和Get-PSDrive保证数据准确)
            $volume = Get-Volume -DriveLetter $item.DriveLetter -ErrorAction Stop
            $driveInfo = Get-PSDrive -Name $item.DriveLetter -ErrorAction Stop
            
            # 整理统计结果
            $results += [PSCustomObject]@{
                共享路径 = $item.Name
                驱动器号 = $item.DriveLetter
                总容量_GB = [math]::Round($volume.Size / 1GB, 2)
                可用空间_GB = [math]::Round($volume.SizeRemaining / 1GB, 2)
                已用空间_GB = [math]::Round(($volume.Size - $volume.SizeRemaining) / 1GB, 2)
                处理状态 = "成功"
            }
        }
        catch {
            # 捕获异常,记录失败原因
            $results += [PSCustomObject]@{
                共享路径 = $item.Name
                驱动器号 = $item.DriveLetter
                总容量_GB = $null
                可用空间_GB = $null
                已用空间_GB = $null
                处理状态 = "失败:$($_.Exception.Message)"
            }
            Write-Warning "处理共享 $($item.Name) 失败:$($_.Exception.Message)"
        }
    }
    
    # 强制解绑当前组的所有驱动器(不管成功与否都清理,避免占用)
    foreach ($letter in $pairedItems.DriveLetter) {
        if (Get-PSDrive -Name $letter -ErrorAction SilentlyContinue) {
            Remove-PSDrive -Name $letter -Force -ErrorAction SilentlyContinue
        }
    }
    
    Write-Host "第 $($group.Name) 组处理完成,已清理所有映射驱动器`n"
}

# 导出最终结果到CSV
$results | Export-Csv -Path $outputCsvPath -Encoding UTF8 -NoTypeInformation
Write-Host "所有处理完成!结果已导出到:$outputCsvPath"

关键细节说明

  1. 自动分组逻辑:用[math]::Floor($script:i++ / $batchSize)给每个共享路径分配组号,自动按22个一组拆分,$script:i确保计数器在整个脚本范围内生效。
  2. 驱动器号配对:通过Select-Object -Index把当前组的共享路径和E-Z的驱动器号一一对应,避免驱动器号浪费。
  3. 容量数据准确性:结合Get-Volume和Get-PSDrive获取容量数据,转换为GB单位并保留两位小数,更直观易读。
  4. 异常容错:每个映射和统计步骤都加了try/catch,即使某个共享处理失败,也不会中断整个组的流程,同时记录详细的失败原因。
  5. 驱动器清理:每组处理完强制解绑所有映射的驱动器,确保下一组的驱动器号可用,避免冲突。

额外优化建议

  • 如果部分共享需要特定权限,可以在New-PSDrive里加上-Credential参数指定有权限的账户。
  • 可以添加Write-Progress显示更详细的处理进度,比如:
    Write-Progress -Activity "处理DFS共享" -Status "第 $($group.Name) 组" -PercentComplete ($group.Name / $groups.Count * 100)
    
  • 若担心脚本中断丢失数据,可在每组处理完后追加导出结果到CSV(第一次导出不要加-Append,或先判断文件是否存在):
    $results | Export-Csv -Path $outputCsvPath -Encoding UTF8 -NoTypeInformation -Append
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:19:07