使用PowerShell更新XML元素值时遇到问题
问题概述
需要为200款游戏配置按钮映射,映射通过指定结构的XML文件实现。编写的PowerShell脚本可完成批量读取XML文件、过滤飞行/驾驶/射击等类型游戏、遍历游戏按键并提示输入映射,但无法将输入的按键值更新到XML的InputMapping元素,其余功能均正常。
原脚本核心问题
- 重复加载XML且路径错误:先通过
Get-Content加载XML,又用New-Object XML重新加载,且加载路径写成C:\PATH\$game,$game是文件对象,直接拼接会导致路径无效。 - 按键值类型错误:用
$host.ui.rawui.readkey()获取的是KeyInfo对象,不是字符串,直接赋值给XML的InputMapping元素会导致序列化失败,无法写入正确值。 - 未保存修改:仅修改了内存中的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
相关产品推荐
相关产品推荐

