Wie kann ich Powershell verwenden, um hinzuzufügen/entfernen Sie Verweise auf eine csproj?

In Bezug auf diese Vorherige Frage ich bin versucht, eine batch-Datei erstellen, die als Teil entfernen müssen, und fügen Sie eine Referenz zu einem XML *.csproj-Datei. Ich habe mir bei diese, diese, diese und diese Vorherige Frage, sondern als ein powershell n00b bin nicht in der Lage, um es arbeiten (so weit).

Kann mir jemand helfen mit dem folgenden? Ich möchte zu entfernen, zwei spezifische Referenzen in einem VS2010-csproj-Datei (XML) und fügen Sie eine neue Referenz.

Öffnete ich die csproj und der Bezug kann am folgenden Speicherort gefunden

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <!--          ...         -->
  <!-- Omitted for brevity  -->
  <!--          ...         -->

  <ItemGroup Condition="'$(BuildingInsideVisualStudio)' == 'true'">
    <AvailableItemName Include="Effect" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\SomeDirectory\SomeProjectFile.csproj">
      <Project>{AAB784E4-F8C6-4324-ABC0-6E9E0F73E575}</Project>
      <Name>SomeProject</Name>
    </ProjectReference>
    <ProjectReference Include="..\AnotherDirectory\AnotherProjectFile.csproj">
      <Project>{B0AA6A94-6784-4221-81F0-244A68C374C0}</Project>
      <Name>AnotherProject</Name>
    </ProjectReference>
  </ItemGroup>

  <!--          ...         -->
  <!-- Omitted for brevity  -->
  <!--          ...         -->

</Project>

Grundsätzlich möchte ich:

  • entfernen Sie diese beiden Referenzen
  • legen Sie eine neue Referenz, um eine vorkompilierte DLL mit dem angegebenen relativen Pfad
  • ODER Fügen Sie einen Assemblyverweis Ort, um das Projekt angegebenen relativen Pfad

Als ein sehr einfaches Beispiel, ich habe versucht, das folgende powershell-Skript zum löschen aller ProjectReference Knoten. Gebe ich den Pfad zur csproj als argument. Ich bekomme die Fehlermeldung Cannot validate the argument 'XML'. The Argument is null or empty. Kann ich bestätigen, es ist laden Sie die csproj-und speichern Sie Sie in-place-unverändert, so dass der Pfad korrekt ist.

param($path)
$MsbNS = @{msb = 'http://schemas.microsoft.com/developer/msbuild/2003'}

function RemoveElement([xml]$Project, [string]$XPath, [switch]$SingleNode)
{
    $xml | Select-Xml -XPath $XPath | ForEach-Object{$_.Node.ParentNode.RemoveAll()}
}

$proj = [xml](Get-Content $path)
[System.Console]::WriteLine("Loaded project {0} into {1}", $path, $proj)

RemoveElement $proj "//ProjectReference" -SingleNode

    # Also tried
    # RemoveElement $proj "/Project/ItemGroup/ProjectReference[@Include=`'..\SomeDirectory\SomeProjectFile.csproj`']" -SingleNode
    # but complains cannot find XPath

$proj.Save($path)

Was mache ich falsch? Irgendwelche Kommentare/Vorschläge erwünscht 🙂

InformationsquelleAutor Dr. ABT | 2012-01-22
Schreibe einen Kommentar