PowerShell从远程服务器PathInfo加载XML;无法保存

时间:2014-12-04 20:08:33

标签: xml windows powershell

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

  1. 通过Get-Content和[xml]
  2. 加载XML
  3. 操作内存中的XmlDocument
  4. 保存XML
  5. 脚本开头是这样的:

    $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路径的本机PowerShell cmdlet Get-Context。但是当调用Save(...)时,我们真的在XmlDocument类上调用.NET方法,它不理解PowerShell路径并引发异常。

    是否没有简洁,对称,PowerShell意味着编写XML文件?

1 个答案:

答案 0 :(得分:2)

Resolve-Path会返回PathInfo - 对象,但Save()方法需要string - 类型。当您使用PathInfo - 对象作为Save()的输入时,它会将对象转换为字符串。正如您已经发现的那样,toString()的{​​{1}}会返回完整的" PowerShell路径"包括PSProvider细节,这与" normal"不兼容。 .Net方法

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

作为替代方案,您可以重写代码以使用PathInfo来获取更常用的Get-Item - 具有FileInfo - 属性的对象。

使用FullName的示例:

Resolve-Path

使用$fileName = Resolve-Path (Join-Path $targetDir $xmlFile.FileName) [xml]$xdoc = Get-Content $fileName ... $xdoc.Save($fileName.ProviderPath); 的示例:

Get-Item