【问题标题】:PowerShell load XML from remote server PathInfo; Can't savePowerShell 从远程服务器 PathInfo 加载 XML;无法保存
【发布时间】:2015-02-02 20:49:01
【问题描述】:

我有一个小脚本来操作一些 XML。这个想法很简单:

  1. 通过 Get-Content 和 [xml] 加载 XML
  2. 操作内存中的 XmlDocument
  3. 保存 XML

脚本的开头是这样的:

$fileName = Resolve-Path (Join-Path $targetDir $xmlFile.FileName)
[xml]$xdoc = Get-Content $fileName
...
$xdoc.Save($fileName);

但是,Save(...) 失败并显示“不支持给定路径的格式”。我添加的一些诊断显示路径如下所示:

Microsoft.PowerShell.Core\FileSystem::\\remoteserver\sharedfolder\test.xml

据我了解,这是路径的 PowerShell 变体...实际上是 PathInfo(或 PathInfo 的 .ToString() 输出)。

当我使用本地路径时,Save(...) 工作正常。它只会中断远程路径。

加载 XML 不是问题,因为我们使用的是本地 PowerShell cmdlet Get-Context,它可以理解 PowerShell 路径。但是当调用 Save(...) 时,我们实际上是在调用 XmlDocument 类的 .NET 方法,它不理解 PowerShell 路径并引发异常。

难道没有简洁、对称、PowerShell的方式来写一个XML文件吗?

【问题讨论】:

    标签: xml windows powershell


    【解决方案1】:

    Resolve-Path 返回 PathInfo-object,但 Save() 方法需要 string-type。当您使用PathInfo-object 作为Save() 的输入时,它会将对象转换为字符串。正如您已经知道的那样,PathInfo 的toString() 返回完整的“PowerShell 路径”,包括 PSProvider 详细信息,这与“普通”.Net 方法不兼容。

    您可以使用PathInfo 提供的ProviderPath-属性来获取“正常”路径。

    作为替代方案,您可以重写代码以使用Get-Item 来获得更常用的FileInfo-object,它具有FullName-property。

    使用Resolve-Path的示例:

    $fileName = Resolve-Path (Join-Path $targetDir $xmlFile.FileName)
    [xml]$xdoc = Get-Content $fileName
    ...
    $xdoc.Save($fileName.ProviderPath);
    

    使用Get-Item的示例:

    $file = Get-Item (Join-Path $targetDir $xmlFile.FileName)
    [xml]$xdoc = Get-Content $file
    ...
    $xdoc.Save($file.FullName);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      • 2016-12-14
      • 1970-01-01
      • 2018-07-12
      • 1970-01-01
      • 1970-01-01
      • 2016-12-09
      相关资源
      最近更新 更多