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

将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")

关键修改点:

  1. 用ImportNode方法将临时XML中的<Node>节点导入到目标文档,确保节点属于同一DOM上下文
  2. 明确指定目标父节点(避免用ChildNodes[1]这种硬编码索引,防止结构变化导致错误)
  3. 最后调用Save方法保存修改后的配置

修复Import-CliXml错误

Import-CliXml仅适用于加载PowerShell序列化的CliXml格式文件(由Export-CliXml生成),而Terminals和mRemoteNG的XML是自定义配置格式,因此不要使用Import-CliXml,继续用[xml]类型转换加载普通XML文件即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 19:50:18