批处理脚本不处理嵌套批处理文件的输入参数

时间:2014-11-18 16:30:16

标签: batch-file nested

我正在尝试构建一个命令行交叉编译批处理脚本以在Visual Studio 2010中编译我的程序(这是唯一的选项,因为msbuild不能与安装文件一起使用)。批处理脚本如下所示(buildall.bat):

if %1 == x86 goto x86
if %1 == x64 goto x64

:x86
%comspec% /k ""C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"" x86 < crosscompile.bat x86
goto :eof

:x64
%comspec% /k ""C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"" x86_amd64 < crosscompile.bat x64
goto :eof

其中crosscompile.bat是包含

下面的实际构建命令的文件
devenv Studd.sln /clean "Release|%1"
IF %ERRORLEVEL% NEQ 0 EXIT /B %ERRORLEVEL%
devenv Studd.sln /rebuild "Release|%1"
IF %ERRORLEVEL% NEQ 0 EXIT /B %ERRORLEVEL%

问题出在我运行此命令时:

buildall.bat x64

最终运行这个:

D:\x>if "x64" == "" goto all
D:\x>if x64 == x86 goto x86
D:\x>if x64 == x64 goto x64
D:\x>C:\Windows\system32\cmd.exe /k ""C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"" x86_amd64  x64 0<crosscompile.bat
Error in script usage. The correct usage is:
    "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" [option]
where [option] is: x86 | ia64 | amd64 | x86_amd64 | x86_ia64

For example:
    "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86_ia64
D:\x>devenv Studd.sln /clean "Release|%1"
'devenv' is not recognized as an internal or external command,
operable program or batch file.
D:\x>IF %ERRORLEVEL% NEQ 0 EXIT /B %ERRORLEVEL%
D:\x>goto :eof

问题出在这里

D:\x>C:\Windows\system32\cmd.exe /k ""C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"" x86_amd64  x64 0<crosscompile.bat

我原来的批处理脚本说:

%comspec% /k ""C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"" x86_amd64 < crosscompile.bat x64

我似乎无法理解为什么在crosscompile.bat之后需要x64(这是它的参数)并将它放在它之前并引入0?

如果我为crosscompile.bat(x86和x64)编写2个单独的脚本,我没有传递任何参数,它可以正常工作。但我想重用crosscompile.bat,以便我如何才能完成这项工作。我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

cmd /k vcvarsall.bat x86_amd64 < crosscompile.bat x64

这意味着:使用从文件重定向的输入流(磁盘中的文件,而不是执行)crosscompile.bat启动cmd实例,并且cmd实例的参数是该行的其余部分,即,/k vcvars.bat x86_amd64 x64

这样做容易得多

cmd /k " "vcvarsall.bat" x86_amd64 & "crosscompile.bat" x64"

初始化变量,然后调用compile bat。

已编辑这是我用于测试的命令行。

"%comspec%" /k " "c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86 & "c:\testvc.bat" x86"