PowerShell анализирует XML и сохраняет изменения - PullRequest
10 голосов
/ 18 мая 2011

Я анализирую файл csproj для установки nuget, и у меня есть узел, который необходимо изменить.Рассматриваемый узел - это узел с именем «Генератор», где его значение равно «TextTemplatingFileGenerator», а его родительский узел имеет атрибут «WebConfigSettingsGeneratorScript.tt» (второй части здесь еще нет).

Вотсценарий, который у меня есть, но он не совсем готов.Работает, но сохраняет пустой файл.Кроме того, в нем нет 2-й части моего предложения 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!

Ответы [ 2 ]

24 голосов
/ 18 мая 2011

Как говорит @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)
5 голосов
/ 18 мая 2011

Вам не хватает состава?

$xml = [xml] gc $file.FullName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...