将Terminals收藏文件转mRemoteNG配置文件的PowerShell问题
Terminals收藏文件转mRemoteNG配置文件的PowerShell XML处理问题
需求说明
将Robert Chartier的Terminals收藏文件(XML格式)转换为mRemoteNG的XML配置文件:
- 遍历
C:\Temp\tempTerminals.xml中的每个<favorite>节点 - 将其转换为指定格式的
<Node>节点,添加到C:\Temp\tempRemoteng.xml的空配置文件中 - 需修改
<Node>的Name、Hostname属性,为Id属性生成新GUID
遇到的错误
错误1:节点类型不匹配
执行以下PowerShell代码时,报错:
"The specified node cannot be inserted as the valid child of this node, because the specified node is the wrong type."
原代码:
$terminals = Get-Content -Path "C:\Temp\tempTerminals.xml" $terminalsDoc = [xml]$terminals $remoteNg = Get-Content -Path "C:\Temp\tempRemoteng.xml" $remoteNgDoc = [xml]$remoteNg clear # Accessing elements $root = $terminalsDoc.favorites.ChildNodes $childNode = $remoteNgDoc.ChildNodes[1] foreach($node in $root) { $rootValue = $node.name $rootURI = $node.serverName $newNode = [xml]@" <Node Name="$($rootValue)" Type="Connection" Descr="" Icon="mRemoteNG" Panel="General" Id="$(New-Guid)" Username="_username_" Domain="_domain_" Password="_Password_" Hostname="$($rootURI)" Protocol="RDP" PuttySession="Default Settings" Port="3389" ConnectToConsole="false" UseCredSsp="true" RenderingEngine="IE" ICAEncryptionStrength="EncrBasic" RDPAuthenticationLevel="NoAuth" RDPMinutesToIdleTimeout="0" /> "@ $childNode.AppendChild($newNode) }
错误2:Import-CliXml不支持普通XML
尝试用Import-CliXml处理两个文件时,报错:
Import-CliXml : Element 'Objs' with namespace name 'http://schemas.microsoft.com/powershell/2004/04' was not found. Line 1, position 2.
解决方案
修复节点类型不匹配问题
错误原因:$newNode是完整的XML文档对象,不是单个<Node>节点,直接追加会导致类型不兼容。需要提取目标节点并导入到目标XML文档的上下文:
修改后的代码:
# 加载源文件和目标文件 $terminalsDoc = [xml](Get-Content -Path "C:\Temp\tempTerminals.xml" -Raw) $remoteNgDoc = [xml](Get-Content -Path "C:\Temp\tempRemoteng.xml" -Raw) # 获取Terminals的favorite节点集合 $favoriteNodes = $terminalsDoc.favorites.ChildNodes # 确认mRemoteNG的目标父节点(根据你的空配置结构调整,比如假设是<Root>节点) # 示例:如果空配置是<Connections><Root></Root></Connections>,则用$remoteNgDoc.Connections.Root $targetParent = $remoteNgDoc.ChildNodes | Where-Object { $_.Name -eq "Root" } # 如果不确定结构,可以先打印节点查看:$remoteNgDoc.DocumentElement.ChildNodes | Select-Object Name foreach($favorite in $favoriteNodes) { # 提取源节点的属性值 $connName = $favorite.name $connHost = $favorite.serverName $newGuid = (New-Guid).ToString() # 构造Node的XML字符串并解析为临时XML $nodeXml = @" <Node Name="$connName" Type="Connection" Descr="" Icon="mRemoteNG" Panel="General" Id="$newGuid" Username="_username_" Domain="_domain_" Password="_Password_" Hostname="$connHost" Protocol="RDP" PuttySession="Default Settings" Port="3389" ConnectToConsole="false" UseCredSsp="true" RenderingEngine="IE" ICAEncryptionStrength="EncrBasic" RDPAuthenticationLevel="NoAuth" RDPMinutesToIdleTimeout="0" /> "@ $tempXml = [xml]$nodeXml # 将节点导入到目标文档的上下文 $nodeToAdd = $remoteNgDoc.ImportNode($tempXml.DocumentElement, $true) # 追加到目标父节点 $targetParent.AppendChild($nodeToAdd) } # 保存修改后的mRemoteNG配置文件 $remoteNgDoc.Save("C:\Temp\tempRemoteng.xml")
关键修改点:
- 用
ImportNode方法将临时XML中的<Node>节点导入到目标文档,确保节点属于同一DOM上下文 - 明确指定目标父节点(避免用
ChildNodes[1]这种硬编码索引,防止结构变化导致错误) - 最后调用
Save方法保存修改后的配置
修复Import-CliXml错误
Import-CliXml仅适用于加载PowerShell序列化的CliXml格式文件(由Export-CliXml生成),而Terminals和mRemoteNG的XML是自定义配置格式,因此不要使用Import-CliXml,继续用[xml]类型转换加载普通XML文件即可。
内容的提问来源于stack exchange,提问作者MB34
相关产品推荐
相关产品推荐

