Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PowerShell解析xml并保存更改_Xml_Powershell - Fatal编程技术网

PowerShell解析xml并保存更改

PowerShell解析xml并保存更改,xml,powershell,Xml,Powershell,我正在为nuget安装解析一个csproj文件,我有一个节点需要修改。所讨论的节点是名为“Generator”的节点,其中它的值等于“TextTemplatingFileGenerator”,并且它的父节点具有“WebConfigSettingsGeneratorScript.tt”属性(第二部分还不在这里) 这是我拿到的剧本,但还没完成。它正在工作,但它保存了一个空文件。而且,它没有where子句的第二部分,即 $path = 'C:\Projects\Intouch\NuGetTestPac

我正在为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>

文本模板文件生成器
WebConfigSettingGeneratorScript.txt


非常感谢。我是一个彻头彻尾的超级地狱n00b

你缺演员吗

$xml = [xml] gc $file.FullName $xml=[xml]gc$file.FullName
正如@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)

好的,现在我的更改生效了:

    $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)

这会有所帮助,但$xml.Save($file.FullName)将作为无效操作出现。如果对应的XmlDocument格式不正确,记录要引发的唯一异常XmlDocument.Save(字符串路径)是XmlException。顺便说一句,您还应该去掉
Set Content$file.FullName$xml
,因为
$xml.Save($file.FullName)
调用将在原始文件上进行保存。太好了,我接受了您提供的更改。但是,它似乎没有对文件进行更改。但是,脚本正在保存文件。这个脚本的问题实际上只是我的XML比我提供的更复杂,这才是真正的问题。下面是这个问题的一个简单版本:@DonRolling您找到.csproj文件被覆盖的原因了吗?在尝试使用NuGet package script tools\install.ps1更新.csproj文件时,我遇到了相同的问题