繁体   English   中英

Windows cmd多次调用批处理文件

[英]windows cmd call batch file many times

这是批处理脚本:

@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会根据需要进行自身调用,但是如果选择4,则只有树时间,如果第四次它崩溃并出错, 则输入行太长,请帮忙

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM