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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 21:55:15