PowerShell解析xml并保存更改
问题描述:
我正在解析nuget安装的csproj文件,并且我有一个需要修改的节点。所讨论的节点是名为“Generator”的节点,其值等于“TextTemplatingFileGenerator”,并且其父节点具有“WebConfigSettingsGeneratorScript.tt”(第二部分尚未在此处)的属性。PowerShell解析xml并保存更改
这是我得到的脚本,但它没有完成。它正在工作,但它保存了一个空文件。此外,它没有我的where子句,这是
$path = 'C:\Projects\Intouch\NuGetTestPackage\NuGetTestPackage'
cd $path
$files = get-childitem -recurse -filter *.csproj
foreach ($file in $files){
""
"Filename: {0}" -f $($file.Name)
"=" * ($($file.FullName.Length) + 10)
if($file.Name -eq 'NuGetTestPackage1.csproj'){
$xml = gc $file.FullName |
Where-Object { $_.Project.ItemGroup.None.Generator -eq 'TextTemplatingFileGenerator' } |
ForEach-Object { $_.Project.ItemGroup.None.Generator = '' }
Set-Content $file.FullName $xml
}
}
这里是XML的基本版本的第二部分:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<None Include="T4\WebConfigSettingGeneratorScript.tt">
<Generator>TextTemplatingFileGenerator</Generator>
<LastGenOutput>WebConfigSettingGeneratorScript.txt</LastGenOutput>
</None>
非常感谢。我是一个完整的PowerShell n00b!
答
由于@empo说,你需要的gc $file.FullName
输出转换为[XML]例如$xml = [xml](gc $file.FullName)
。然后在更改之后但在循环到下一个文件之前,您需要保存文件,例如$xml.Save($file.FullName)
。
此作品与您提供的样本项目:
$file = gi .\test.csproj
$pattern = 'TextTemplatingFileGenerator'
$xml = [xml](gc $file)
$xml | Where {$_.Project.ItemGroup.None.Generator -eq $pattern} |
Foreach {$_.Project.ItemGroup.None.Generator = ''}
$xml.Save($file.Fullname)
答
你是否缺少演员?
$xml = [xml] gc $file.FullName
这会有所帮助,但$ xml.Save($ file.FullName)快到了是无效操作。 – 2011-05-18 13:41:52
如果相应的XmlDocument格式不正确,则记录XmlDocument.Save(string path)唯一的异常是XmlException。顺便说一句,你还应该抛弃'Set-Content $ file.FullName $ xml',因为'$ xml.Save($ file.Fullname)'调用会保存在原始文件中。 – 2011-05-18 15:32:28
太好了,我已经采取了您提供的更改。但是,它似乎没有对文件进行更改。但是,该脚本正在保存该文件。 – 2011-05-18 16:08:28