如何用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"
关键细节说明
- 自动分组逻辑:用
[math]::Floor($script:i++ / $batchSize)给每个共享路径分配组号,自动按22个一组拆分,$script:i确保计数器在整个脚本范围内生效。 - 驱动器号配对:通过
Select-Object -Index把当前组的共享路径和E-Z的驱动器号一一对应,避免驱动器号浪费。 - 容量数据准确性:结合
Get-Volume和Get-PSDrive获取容量数据,转换为GB单位并保留两位小数,更直观易读。 - 异常容错:每个映射和统计步骤都加了
try/catch,即使某个共享处理失败,也不会中断整个组的流程,同时记录详细的失败原因。 - 驱动器清理:每组处理完强制解绑所有映射的驱动器,确保下一组的驱动器号可用,避免冲突。
额外优化建议
- 如果部分共享需要特定权限,可以在
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
相关产品推荐
相关产品推荐

