Как добавить новую PropertyGroup в csproj из powershell - PullRequest
3 голосов
/ 03 апреля 2012

У меня есть следующий файл PS1. В этом файле три проблемы.

Q1. Как использовать одинарные и двойные кавычки в XML? Я погуглил и обнаружил, что мне нужно поставить еще одну одинарную цитату. Я пытался, но не сработало.

Q2. Я получил ошибку "неправильный тип", когда я добавляю новую группу PropertyGroup в качестве дочернего элемента к узлу проекта. Как я могу это исправить.

Q3. Могу ли я добавить несколько групп PropertyGroup к узлу проекта?

$dir = "C:\Work\scripttest\output\"
$ns = @{ defaultNamespace = "http://schemas.microsoft.com/developer/msbuild/2003" }

$configs = [xml]"<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Dev-1|AnyCPU'">
    <OutputPath>bin\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <Optimize>true</Optimize>
    <DebugType>pdbonly</DebugType>
    <PlatformTarget>AnyCPU</PlatformTarget>
    <ErrorReport>prompt</ErrorReport>
  </PropertyGroup>  
  ";

Get-ChildItem $dir *.csproj -recurse | 
   % { 
   $content = [xml](gc $_.FullName); 
   $project = $content.Project;
   $project
   $project.AppendChild($configs);
   # $content.Save($_.FullName);
   }

Заранее спасибо!

1 Ответ

1 голос
/ 04 апреля 2012

Q1: Escape-символ в powershell - это `а не кавычка. Имейте в виду, что вы также должны экранировать символ $

Q2: у вас были проблемы, потому что $project.AppendChild(); - это XmlNode, а ваш $configs - это XmlDocument

Q3: Вы можете, но не уверены, что MsBuild будет доволен этим

А вот и сам скрипт:

$dir = "C:\Work\scripttest\output\"
$ns = @{ defaultNamespace = "http://schemas.microsoft.com/developer/msbuild/2003" }

$configs = [xml] "<PropertyGroup Condition=`"'`$(Configuration)|`$(Platform)' == 'Dev-1|AnyCPU'`">
     <OutputPath>bin\</OutputPath>
     <DefineConstants>TRACE</DefineConstants>
     <Optimize>true</Optimize>
     <DebugType>pdbonly</DebugType>
     <PlatformTarget>AnyCPU</PlatformTarget>
     <ErrorReport>prompt</ErrorReport>
</PropertyGroup>"

Get-ChildItem $dir *.csproj -recurse | 
% { 
  $content = [xml](gc $_.FullName); 
  $importNode = $content.ImportNode($configs.DocumentElement, $true) 
  $project = $content.Project;
  $project
  $project.AppendChild($importNode);
  # $content.Save($_.FullName);
}

Как видите, мне пришлось импортировать первый элемент, как это было из другого документа

...