我正在解析一个用于nuget安装的csproj文件,并且我有一个需要更改的节点。有问题的节点是名为“Generator”的节点,其值等于“TextTemplatingFileGenerator”,它的父节点的属性为“WebConfigSettingsGeneratorScript.tt”(第二部分尚未在此处)。
这是我已经获得的脚本,但它还没有完成。它正在工作,但它保存了一个空文件。此外,它没有我的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!
答案 0 :(得分:23)
正如@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)
答案 1 :(得分:5)
你错过了演员吗?
$xml = [xml] gc $file.FullName
答案 2 :(得分:0)
好的,现在我的更改正在执行:
$fileName = “C:\sovgarde\updates.xml”;
$xml = [System.Xml.XmlDocument](Get-Content $fileName);
$child = $xml.CreateElement('option')
$child.SetAttribute('name', 'CHECK_NEEDED')
$child.SetAttribute('value','false')
If ($xml.application.component.option.name -icontains "CHECK_NEEDED") {
$xml.SelectNodes("//option[@name=`"CHECK_NEEDED`"]") | % {$_.ParentNode.removechild($_) }
#$xml.Save($fileName)
}
$node = $xml.SelectSingleNode('//component')
$node.AppendChild($child)
$xml.Save($fileName)