这是批处理脚本:
@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则第四次崩溃时会出现错误输入行太长请任何帮助
答案 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
。