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) 
+0

这会有所帮助,但$ xml.Save($ file.FullName)快到了是无效操作。 – 2011-05-18 13:41:52

+1

如果相应的XmlDocument格式不正确,则记录XmlDocument.Save(string path)唯一的异常是XmlException。顺便说一句,你还应该抛弃'Set-Content $ file.FullName $ xml',因为'$ xml.Save($ file.Fullname)'调用会保存在原始文件中。 – 2011-05-18 15:32:28

+0

太好了,我已经采取了您提供的更改。但是,它似乎没有对文件进行更改。但是,该脚本正在保存该文件。 – 2011-05-18 16:08:28

你是否缺少演员?

 
$xml = [xml] gc $file.FullName