【发布时间】:2012-01-22 18:10:49
【问题描述】:
关于this previous question 我正在尝试创建一个批处理文件,作为一部分必须删除并添加对 XML *.csproj 文件的引用。我看过this、this、this 和this 上一个问题,但作为一个powershell n00b 无法让它工作(到目前为止)。
谁能帮我解决以下问题?我想删除 VS2010 csproj 文件 (XML) 中的两个特定引用并添加一个新引用。
我打开了csproj,可以在以下位置找到参考
<?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>
基本上我想:
- 删除这两个引用
- 插入对由相对路径指定的预编译 DLL 的新引用
- 或将程序集引用位置添加到相对路径指定的项目中
作为一个非常简单的示例,我尝试了以下 powershell 脚本来删除所有 ProjectReference 节点。我将路径传递给 csproj 作为参数。我收到错误Cannot validate the argument 'XML'. The Argument is null or empty。我可以确认它正在加载 csproj 并将其保存在原地未修改,因此路径是正确的。
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)
我做错了什么?欢迎任何 cmets/建议 :)
【问题讨论】:
标签: xml visual-studio-2010 powershell csproj