如何提取diskpart文本输出指定列并追加服务器名生成CSV文件
实现思路
diskpart的list disk输出是纯文本固定宽度格式,你之前导出文件带表头分隔线,是因为直接把原始文本行写入了CSV,没有做结构化解析,正确实现步骤如下:
- 过滤有效数据行:执行diskpart命令后,先筛掉空行、执行提示行,仅保留表头行和实际磁盘数据行,主动丢弃表头下方的
---格式分隔线 - 动态解析列边界:通过表头行的各列起始位置计算每列的宽度区间,不要硬编码列宽,避免不同系统/语言环境下列宽不一致导致的解析错误
- 字段裁剪与新增:仅提取
Disk ###、Status、Size、Free四列的值,丢弃最后两列Dyn、Gpt,新增server字段赋值为对应服务器名称 - 结构化导出CSV:把每一行处理为PowerShell自定义对象后,用原生
Export-Csv命令导出,不要手动拼接CSV文本,原生命令会自动处理转义、表头格式,不会生成多余分隔线
可直接运行的示例代码
# 1. 执行diskpart获取list disk原始输出 $diskpartOutput = diskpart /s "`nlist disk`nexit" | Out-String $allLines = $diskpartOutput -split "`r?`n" | Where-Object { $_.Trim() -ne '' } # 2. 定位表头行,跳过分隔线获取数据行 $headerLine = $allLines | Where-Object { $_ -match 'Disk ###\s+Status' } | Select-Object -First 1 $headerIndex = [array]::IndexOf($allLines, $headerLine) $dataLines = $allLines[($headerIndex + 2)..($allLines.Count - 1)] # 3. 动态计算各列的起始位置 $columnNames = @('Disk ###', 'Status', 'Size', 'Free', 'Dyn', 'Gpt') $colPositions = $columnNames | ForEach-Object { $headerLine.IndexOf($_) } # 4. 逐行解析生成结构化对象 $diskResult = foreach ($line in $dataLines) { $diskNum = $line.Substring($colPositions[0], $colPositions[1] - $colPositions[0]).Trim() $status = $line.Substring($colPositions[1], $colPositions[2] - $colPositions[1]).Trim() $size = $line.Substring($colPositions[2], $colPositions[3] - $colPositions[2]).Trim() $free = $line.Substring($colPositions[3], $colPositions[4] - $colPositions[3]).Trim() # 此处可替换为自定义的服务器名称获取逻辑 $serverName = $env:COMPUTERNAME [PSCustomObject]@{ Server = $serverName DiskNum = $diskNum Status = $status Size = $size Free = $free } } # 5. 导出为标准CSV,支持直接用Import-Csv读取 $diskResult | Export-Csv -Path "C:\disk_info.csv" -Encoding UTF8 -NoTypeInformation
关键注意点
- 导出时加
-NoTypeInformation参数可去掉CSV开头多余的类型标识行,符合通用CSV格式规范 - 动态列截取逻辑兼容中英文系统的diskpart输出,不会因为区域设置导致字段截取错误
内容的提问来源于stack exchange,提问作者Empty Coder
相关产品推荐
相关产品推荐

