2014-12-20 2 views
0

здесь партия сценарий:окна 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 в четвертый раз он падает с ошибкой входной линии слишком долго любая помощь, пожалуйста,

+0

Вы проверили, как выглядит строка 'call% ~ f0% 1'? Каковы значения '% ~ f0' и'% 1'? – GolezTrol

+0

% ~ f0 - полный путь к запущенному пакетному файлу, а% 1 - это командная строка, переданная этому пакетному файлу в моем случае .cpp-файл, который должен быть скомпилирован –

+0

Возможно, это не дубликат, но [этот вопрос] (http: /stackoverflow.com/questions/16821784/input-line-is-too-long-error-in-bat-file), похоже, примерно такое же сообщение об ошибке. Может быть, это полезно. – GolezTrol

ответ

0

либо vsvars32.bat или VsDevCmd.bat (или оба) добавлением к переменной (скорее всего, PATH) без проверки, чтобы убедиться, необходимое значение уже xists. В конце концов, командная строка, которая пытается добавить к переменной, превышает максимальную длину командной строки 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) Поставьте метку ниже проблемные звонки и пользоваться 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.

+0

, благодаря как решениям endlocal, так и goto хорошие решения я бы проголосовал, но у меня только 14 очков –

Смежные вопросы