windows cmd多次调用批处理文件

时间:2014-12-20 14:58:15

标签: windows batch-file cmd

这是批处理脚本:

@echo off
cls
setlocal EnableDelayedExpansion
title  %~nx0 %1
color 0f
call "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\vsvars32.bat"
call "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\VsDevCmd.bat"
echo.
set linker_file="C:\my_compiler_libs.txt"
if %~x1==.cpp  cl /EHsc @%linker_file% %1 
if %~x1==.c    cl /EHsc @%linker_file% %1 
if %~x1==.sln  msbuild %1 /m  /p:configuration=debug /p:platform=win32   
echo.
if exist "%~n1.obj" del "%~n1.obj"
echo.
echo     1: compile again
echo     2: run in cmd 
echo     3: run
echo     4: exit 
echo.
set /p answer=
if %answer%==1 call %~f0 %1
if %answer%==2 cmd /k "%~n1.exe"
if %answer%==3 "%~n1.exe"
if %answer%==4 exit /b

当我选择 1再次编译时,它可以正常运行,而 my_compiler.bat 会根据需要调用自身,但如果选择1则第四次崩溃时会出现错误输入行太长请任何帮助

1 个答案:

答案 0 :(得分:1)

vsvars32.bat或VsDevCmd.bat(或两者)都附加到变量(很可能是PATH),而不检查所需的值是否已存在。最终,尝试附加到变量的命令行超出了最大命令行长度8191个字节。

您已使用以下方法解决了问题:

if not defined DevEnvDir (
  call "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\vsvars32.bat"
  call "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\VsDevCmd.bat"
)

还有其他方法可以解决这个问题。

1)使用ENDLOCAL丢弃重新启动之前所做的环境更改。正如Magoo所说,没有必要返回父批,因此不需要CALL。

if %answer%==1 (
  endlocal
  %~f0 %1
)

2)在问题CALL下方放置一个标签并使用GOTO

@echo off
cls
setlocal EnableDelayedExpansion
title  %~nx0 %1
color 0f
call "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\vsvars32.bat"
call "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\VsDevCmd.bat"
echo.
set linker_file="C:\my_compiler_libs.txt"

:compile
cls
if %~x1==.cpp  cl /EHsc @%linker_file% %1 
if %~x1==.c    cl /EHsc @%linker_file% %1 
if %~x1==.sln  msbuild %1 /m  /p:configuration=debug /p:platform=win32   
echo.
if exist "%~n1.obj" del "%~n1.obj"
echo.
echo     1: compile again
echo     2: run in cmd 
echo     3: run
echo     4: exit 
echo.
set /p answer=
if %answer%==1 goto compile
if %answer%==2 cmd /k "%~n1.exe"
if %answer%==3 "%~n1.exe"
if %answer%==4 exit /b

我不确定为什么要启用延迟扩展,因为我无法看到您使用它的任何地方。我把它留了下来,但我很确定你可以将setlocal EnableDelayedExpansion改为setlocal