使用PowerShell修改Visual Studio解决方案和项目文件

11
我们正在重新组织我们的源代码,将一些内容移动到新的目录结构中。这会影响我们的Visual Studio解决方案和项目文件,需要更新程序集引用、输出目录、构建前后事件等内容以反映我们所做的更改。
由于我们有许多解决方案和项目,我希望能够使用PowerShell部分自动化这个过程,并创建一个类似于VS的PowerShell“提供程序”:
在理想情况下,我能够执行以下操作:
$MySolution.Projects["MyProject"].PostBuildEvent = "copy <this> to <that>"

我了解关于PowerConsole的信息(我还没有完全探索),它可以用于脚本化Visual Studio。但是,该文档很少且我不确定它是否真正满足我的需求。

还有其他什么工具可以轻松地操作解决方案和项目文件吗?最好是使用PowerShell,但我也愿意接受其他建议。

2个回答

16

根据我的经验,使用PowerShell(无论是在Visual Studio内部还是外部)操作Visual Studio解决方案最简单的方法是将项目文件加载为XML,并使用PowerShell进行操作。

$proj = [xml](get-content Path\To\MyProject.csproj)
$proj.GetElementsByTagName("PostBuildEvent") | foreach {
    $_."#text" = 'echo "Hello, World!"'
}
$proj.Save("Path\To\MyProject.csproj")

如果您在 NuGet 包管理器控制台中运行脚本,可以通过以下方式获取所有项目文件的路径:

PM> get-project -all | select -expand FileName
C:\Users\Me\Documents\Visual Studio 10\Projects\MyProject\MyProject.csproj
C:\Users\Me\Documents\Visual Studio 10\Projects\MyProject\MyProjectTests.csproj
PM>

4
不确定这是否算作答案,因为它只回答了问题的一半。解决方案文件不是XML格式,您并没有说明如何打开它们。 - nagytech
4
@Geoist OP说:“我的希望是利用PowerShell部分自动化这个过程”,我希望我已经帮他用PowerShell部分自动化了这个过程。根据我的经验,一旦项目文件被修改,如果只是路径改变而不是项目GUID或名称的话,手动修改解决方案文件就相对容易一些,因为解决方案文件要简单得多。当然,你可以自己添加更有用的答案。 - Damian Powell

0

使用PowerShell编辑解决方案文件对于空格中使用的字符非常挑剔,这使得使用文本替换自动化变得很麻烦。

如果您正在使用PowerShell编辑VS解决方案文件,则很有可能您也可以访问dotnet CLI。我建议从PowerShell调用dotnet CLI,然后使用内置的sln命令:

使用示例:

# Create a solution, a console app, and two class libraries.
dotnet new sln -n mysolution
dotnet new console -o myapp
dotnet new classlib -o mylib1
dotnet new classlib -o mylib2

# Add the projects to the solution
# Use --solution-folder to organize the class libraries into a solution folder.
dotnet sln mysolution.sln add myapp\myapp.csproj
dotnet sln mysolution.sln add mylib1\mylib1.csproj --solution-folder mylibs
dotnet sln mysolution.sln add mylib2\mylib2.csproj --solution-folder mylibs

当从PowerShell调用时,甚至可以使用Glob模式:

dotnet sln todo.sln add (ls -r **/*.csproj)

文档和示例: https://learn.microsoft.com/zh-cn/dotnet/core/tools/dotnet-sln


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接