如何从MSBuild中获取属性值及生成的EXE文件路径?
嘿,针对你提出的两个MSBuild相关问题,我整理了实用的解决方法,都是日常开发中常用的技巧:
1. 如何从MSBuild中获取属性值?
获取属性值分两种常见场景,一种是在项目脚本内部引用,另一种是从命令行外部获取结果:
在项目脚本内部引用或打印
直接用$(PropertyName)语法就能引用属性值,比如要拿OutputPath,就写$(OutputPath)。如果想确认属性值,还可以加个自定义目标打印到控制台:<Target Name="PrintTargetProperty"> <Message Text="当前OutputPath的值是:$(OutputPath)" Importance="High" /> </Target>然后执行命令
msbuild myproject.dproj /t:PrintTargetProperty就能看到结果。从命令行直接获取属性值
如果你用的是MSBuild 16.0及以上版本,直接用/getProperty参数就能快速拿到指定属性:msbuild myproject.dproj /getProperty:OutputPath要是用的旧版本MSBuild,可以给项目加个轻量的自定义目标(如果没加过的话):
<Target Name="_FetchProperty"> <Message Text="$($(PropertyName))" Importance="High" /> </Target>然后通过命令行指定要获取的属性:
msbuild myproject.dproj /t:_FetchProperty /p:PropertyName=OutputPath
2. 获取指定MSBuild命令生成的EXE文件路径
针对你执行的msbuild myproject.dproj /t:Clean;Build /p:Config=Release /p:Platform=Win32命令,有几种可靠的方法拿到生成的EXE路径:
直接用MSBuild内置属性查询
大多数Delphi项目(.dproj)里,TargetPath属性就是生成的EXE完整路径,直接用/getProperty就能拿到:# PowerShell中可以直接捕获结果 $exePath = msbuild myproject.dproj /p:Config=Release /p:Platform=Win32 /getProperty:TargetPath echo $exePath # Windows CMD中可以用for循环捕获 for /f "delims=" %i in ('msbuild myproject.dproj /p:Config=Release /p:Platform=Win32 /getProperty:TargetPath') do set EXEPATH=%i echo %EXEPATH%给项目加个后置目标打印路径
如果你能修改.dproj文件,添加一个在Build完成后触发的目标,就能自动输出路径:<Target Name="ShowExePath" AfterTargets="Build"> <Message Text="生成的EXE路径:$(TargetPath)" Importance="High" /> </Target>然后执行构建命令时带上这个目标:
msbuild myproject.dproj /t:Clean;Build;ShowExePath /p:Config=Release /p:Platform=Win32这样构建完成后,控制台会直接显示EXE的完整路径,不用额外查询。
兜底方法:按配置路径查找
要是不想修改项目文件,也可以去默认输出路径找——Delphi的Release/Win32配置一般会把EXE输出到.\Win32\Release\目录下,名称和项目名一致。不过这个方法依赖默认配置,要是项目自定义了输出路径就会失效,不如前两种靠谱。
内容的提问来源于stack exchange,提问作者R. J.

