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

使用PowerShell更新XML元素值时遇到问题

问题概述

需要为200款游戏配置按钮映射,映射通过指定结构的XML文件实现。编写的PowerShell脚本可完成批量读取XML文件、过滤飞行/驾驶/射击等类型游戏、遍历游戏按键并提示输入映射,但无法将输入的按键值更新到XML的InputMapping元素,其余功能均正常。

原脚本核心问题
  1. 重复加载XML且路径错误:先通过Get-Content加载XML,又用New-Object XML重新加载,且加载路径写成C:\PATH\$game,$game是文件对象,直接拼接会导致路径无效。
  2. 按键值类型错误:用$host.ui.rawui.readkey()获取的是KeyInfo对象,不是字符串,直接赋值给XML的InputMapping元素会导致序列化失败,无法写入正确值。
  3. 未保存修改:仅修改了内存中的XML对象,没有执行保存操作,修改不会写入原文件。
修复后的完整脚本
$games = Get-ChildItem "C:\PATH\UserProfiles" -Filter "*.xml"
$notMatch = "fly","drive","gun","shooter","Racing", "axis" # 忽略这些类型的游戏

foreach($game in $games){
    # 一次性加载XML文件,避免重复操作
    [xml]$xmlContent = Get-Content $game.FullName -Encoding UTF8
    $genre = $xmlContent.GameProfile.GameGenreInternal
    $gameName = $xmlContent.GameProfile.GameNameInternal

    # 过滤不符合要求的游戏
    if($genre -notmatch ($notMatch -join '|') -and $gameName){
        Write-Host -ForegroundColor Yellow $gameName
        Write-Host -ForegroundColor Yellow "----------------------------------------"
        
        $buttons = $xmlContent.GameProfile.JoystickButtons.JoystickButtons
        foreach($button in $buttons){
            Write-Host "请映射按钮: '$($button.ButtonName)'"
            # 读取按键并提取字符值,不显示输入内容
            $keyPress = $host.ui.RawUI.ReadKey("NoEcho, IncludeKeyDown")
            $keyChar = $keyPress.Character
            
            # 更新XML中的InputMapping元素
            $button.InputMapping = $keyChar
            Write-Host "已映射为: $keyChar`n"
        }

        # 将修改后的XML保存回原文件
        $xmlContent.Save($game.FullName)
        Write-Host "已保存游戏 [$gameName] 的按键映射配置`n"
    }
}
关键修复说明
  • 统一XML加载逻辑,使用[xml]类型直接读取文件,避免路径错误和重复加载
  • 修正按键读取:提取KeyInfo对象的Character属性,确保赋值给InputMapping的是字符串类型
  • 添加Save方法,将内存中的修改持久化到原XML文件
  • 优化交互提示,让映射过程更直观

内容的提问来源于stack exchange,提问作者Blake

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 23:30:54