如何用PowerShell递归转换XML为CSV并保留原文件名输出
PowerShell批量转换XML到CSV并保留原文件名
核心解决方案
要提取原文件名并生成对应CSV,直接利用Get-ChildItem返回的FileInfo对象属性是最简洁的方式,无需手动拆分路径。以下是完整的实现代码:
# 定义输入和输出文件夹路径 $inputFolder = "\\path\to\files\" $outputFolder = "\\path\to\output\files\" # 确保输出文件夹存在,不存在则创建 if (-not (Test-Path -Path $outputFolder)) { New-Item -Path $outputFolder -ItemType Directory -Force | Out-Null } # 递归获取所有XML文件(直接返回FileInfo对象,而非仅路径字符串) $xmlFiles = Get-ChildItem -Path $inputFolder -Recurse -File -Filter "*.xml" foreach ($file in $xmlFiles) { # 生成输出CSV路径:用原文件名(不带.xml)+ .csv $csvOutputPath = Join-Path -Path $outputFolder -ChildPath "$($file.BaseName).csv" # 读取并解析XML内容(示例假设XML有统一的节点结构,需根据你的实际XML调整) $xml = [xml](Get-Content -Path $file.FullName -Raw) # 示例:假设XML根节点下有<Item>子节点,每个<Item>对应一行CSV数据 # 替换为你实际需要提取的XML节点路径 $xmlData = $xml.SelectNodes("//Item") | Select-Object -Property * -ExcludeProperty '#comment','#text','OuterXml','InnerXml','NodeType','ParentNode','ChildNodes','PreviousSibling','NextSibling','Attributes','OwnerDocument' # 导出为CSV $xmlData | Export-Csv -Path $csvOutputPath -NoTypeInformation -Encoding UTF8 }
关键细节说明
- 提取原文件名:
$file.BaseName直接返回不带扩展名的原文件名(比如testing123.xml返回testing123),无需手动处理路径字符串。 - 输出路径拼接:用
Join-Path替代字符串拼接,自动处理路径分隔符问题,避免跨平台或路径格式错误。 - 高效获取文件:用
-File和-Filter "*.xml"替代Where-Object,执行效率更高,因为过滤在文件系统层面完成,而非内存中。 - XML解析调整:如果你的XML结构不同(比如根节点不是
<Items>,数据节点不是<Item>),需要修改SelectNodes的XPath表达式,以及Select-Object的属性列表,只保留你需要的字段。
若坚持使用原代码的路径字符串遍历
如果一定要沿用你原来的foreach ($xmlpath in $xmlfilepaths.FullName)写法,可以用System.IO.Path类的静态方法提取文件名:
foreach ($xmlpath in $xmlfilepaths.FullName) { # 提取不带扩展名的原文件名 $fileNameWithoutExt = [System.IO.Path]::GetFileNameWithoutExtension($xmlpath) # 生成CSV输出路径 $csvOutputPath = [System.IO.Path]::Combine($outputFolder, "$fileNameWithoutExt.csv") # 后续XML读取和转换逻辑同上 }
内容的提问来源于stack exchange,提问作者bgorton
相关产品推荐
相关产品推荐

