我有一个小脚本来操作一些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路径的本机PowerShell cmdlet Get-Context。但是当调用Save(...)时,我们真的在XmlDocument类上调用.NET方法,它不理解PowerShell路径并引发异常。
是否没有简洁,对称,PowerShell意味着编写XML文件?
答案 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