PowerShell实现遍历文件夹并根据文件夹名修改XML节点
修复递归修改XML节点的PowerShell脚本
原代码的核心问题
- 循环变量误用:
ForEach ($folder in $folders)上下文里,应该用$folder引用当前文件夹,原代码中$_.Name无有效取值。 - 文件路径错误:未指定目标文件夹路径,始终操作当前工作目录的
info.xml,而非对应子文件夹中的文件。 - 字符串替换语法错误:
"$_.Name"解析逻辑错误,无法正确获取文件夹名称。
方案1:文本替换版(适合确定仅目标节点含"0000")
如果可以确认XML中"0000"只出现在需要修改的节点中,用文本替换快速实现:
# 递归获取C:\Test下所有子文件夹 $folders = Get-ChildItem -Directory -Path C:\Test -Recurse foreach ($folder in $folders) { # 拼接目标XML文件的完整路径 $xmlPath = Join-Path -Path $folder.FullName -ChildPath "info.xml" # 先检查文件是否存在,避免报错 if (Test-Path -Path $xmlPath) { $folderName = $folder.Name # 读取文件内容,替换"0000"为文件夹名,再写回文件 (Get-Content -Path $xmlPath -Raw) -Replace "0000", $folderName | Set-Content -Path $xmlPath -Encoding UTF8 } }
方案2:XML解析版(更安全,精准修改节点)
如果XML中"0000"可能出现在其他位置,建议用XML DOM解析,精准定位目标节点(需根据实际XML结构调整XPath表达式):
$folders = Get-ChildItem -Directory -Path C:\Test -Recurse foreach ($folder in $folders) { $xmlPath = Join-Path -Path $folder.FullName -ChildPath "info.xml" if (Test-Path -Path $xmlPath) { $folderName = $folder.Name # 加载XML文档 $xml = [xml](Get-Content -Path $xmlPath -Raw) # 示例:匹配所有文本值为"0000"的节点,可修改XPath指定具体节点(如"//ID[text()='0000']") $targetNodes = $xml.SelectNodes("//*[text()='0000']") foreach ($node in $targetNodes) { $node.InnerText = $folderName } # 保存修改后的XML文件 $xml.Save($xmlPath) } }
内容的提问来源于stack exchange,提问作者Ken Walter
相关产品推荐
相关产品推荐

