如何使MSBuild的OutDir相对于执行目录而非项目目录?
解决MSBuild OutDir指向当前执行目录的问题
我来帮你搞定这个问题——你遇到的核心问题是OutDir路径的写法错误,导致MSBuild把输出目录解析到了各个项目的根目录下,而不是你执行命令的Tests文件夹。
问题原因
你原来用的OutDir=\Debug\是根目录相对写法,MSBuild会默认把这个路径解析为相对于每个项目文件所在的目录(比如C:\MyProject\Projects\YourProject\Debug\),而不是你执行rebuild_all.cmd的C:\MyProject\Tests\目录。
修正后的命令
你只需要把OutDir设置为相对于当前执行目录的路径,或者直接用当前目录的绝对路径。这里有两种可靠的写法:
写法1:使用CMD的当前目录变量%CD%
在rebuild_all.cmd里执行这个命令:
msbuild ..\Projects\MySln.sln /t:Rebuild /p:Configuration=Debug;OutDir=%CD%\Debug\
%CD%是CMD内置变量,会自动替换为你执行命令时的当前目录(也就是C:\MyProject\Tests\),这样OutDir就会指向C:\MyProject\Tests\Debug\。
写法2:使用MSBuild内置属性$(MSBuildCurrentDirectory)
也可以直接用MSBuild的内置属性来获取当前工作目录:
msbuild ..\Projects\MySln.sln /t:Rebuild /p:Configuration=Debug;OutDir=$(MSBuildCurrentDirectory)Debug\
这个属性是MSBuild原生支持的,会直接指向你执行命令的目录,兼容性更好。
额外注意事项
- 确保
Tests目录下的Debug文件夹存在,或者允许MSBuild自动创建(MSBuild通常会自动生成输出目录,但如果有权限问题可能需要手动创建)。 - 检查解决方案里的项目属性:打开项目的属性窗口,在"生成"(或"Build")选项卡中,把"输出路径"设置为
$(OutDir),这样项目才会继承你在命令行指定的OutDir参数,而不会用项目自身的硬编码路径。 - 确认你调用的是VS2017对应的MSBuild版本:如果你的环境变量里没有配置正确的MSBuild路径,建议直接调用完整路径,比如
"C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\msbuild.exe",避免调用到其他版本的MSBuild。
内容的提问来源于stack exchange,提问作者jleach
相关产品推荐
相关产品推荐

