我致力于自动化我们的软件构建/部署过程。其中一个主要部分是执行msbuild
来编译多个Delphi项目。
在众多资源such as this one之后,我可以从RAD Studio命令行(它只是调用rsvars.bat
来设置一些环境变量)成功完成。但是,当尝试自动执行此批处理文件和Delphi的msbuild
命令时,我无法弄清楚如何继续。
问题的关键是批处理文件和实际的msbuild
命令是两个完全独立的命令 - 尽管它们需要在相同的环境下一起运行。我发现this question有点相关,但我没有看到我的情景的明确答案。
如何在首次使用msbuild
中的环境变量进行准备时,从Delphi执行rsvars.bat
?
答案 0 :(得分:8)
如this answer所示,您可以使用命令行参数运行cmd.exe
来执行命令。
语法
cmd [/c|/k] [/s] [/q] [/d] [/a|/u] [/t:{<B><F>|<F>}] [/e:{on|off}] [/f:{on|off}] [/v:{on|off}] [<String>]
参数
/ C
执行 String 指定的命令,然后停止 ...
&LT;字符串&GT;
指定要执行的命令 ...说明
使用多个命令
要对&lt; String&gt;使用多个命令,请使用命令分隔符&amp;&amp; 将它们分开,并将它们用引号括起来。例如:
"<Command>&&<Command>&&<Command>"
处理引号
如果您指定 / c 或 / k ,则cmd会处理 String 的剩余部分,并且仅当所有的引号都保留时才会保留引号符合以下条件:
您不使用 / s 。
您只使用一组引号。
您不会在引号中使用任何特殊字符(例如:
& < > ( ) @ ^ |
)。在引号中使用一个或多个空格字符。
引号中的 String 是可执行文件的名称。
如果不满足先前的条件,则通过检查第一个字符来处理 String 以验证它是否是开始引号。如果第一个字符是开始引号,则它将与右引号一起被剥离。保留右引号后面的任何文字。
因此,请尝试使用CreateProcess()
或ShellExecute/Ex()
使用以下参数运行cmd.exe
的实例:
cmd.exe /C ""<path>\rsvars.bat" && msbuild "<path>\project" <msbuild parameters> ..."
或者,您可以让您的应用加载rsvars.bat
并解析它定义的值(或者只是在您自己的代码中定义值),然后使用msbuild
执行CreateProcess()
,将所需的环境变量传递给其lpEnvironment
参数。这样,您根本不需要实际执行rsvars.bat
。
答案 1 :(得分:3)
另一种有效的方法是将两个命令放在另一个新的批处理文件中。这也允许您使用相同的环境构建多个项目。例如DoBuild.bat
,其中包含以下内容:
call "C:\Program Files (x86)\Embarcadero\Studio\17.0\bin\rsvars.bat"
msbuild "<path>\MyProject.dproj"
msbuild "<path>\MyOtherProject.dproj"
msbuild "<path>\YetAnotherProject.dproj"
然后,只需执行批处理文件:
Cmd.exe /K "<path>\DoBuild.bat"