Я хочу создать автоматический пакетный скрипт, который может компилировать и связывать (несколько) файл исходного кода C ++ с одним файлом EXE с помощью компилятора G ++.Он работает путем перетаскивания файла (ов) исходного кода в сценарий.
В настоящее время он определяет, является ли удаленный входной файл одним файлом или более.Если это один входной файл (например, MyCode
), то выходной файл будет называться MyCode.exe
.
Но если это более одного входного файла (например, aaa
, bbb
, ccc
и ddd
), затем я хочу, чтобы пользователь предложил выбрать, хотят ли они назвать выходной файл как aaa.exe
, bbb.exe
, ccc.exe
или ddd.exe
, используяfor
loop и set /p
command.
Проблема состоит в том, что команда loop не будет зацикливаться сама, даже если я выберу нет (в данном случае: N
или n
) и сгенерирует EXEфайл как aaa.exe
вместо того, чтобы спрашивать, хочу ли я сделать это как bbb.exe
, ccc.exe
и так далее. Пожалуйста, также посмотрите комментарий rem
к моему сценарию для более подробной информации .
Я действительно запутался, я уже пытался сделать сто обходных путей, чтобы он работал в течение последних 2дней.Я также уже пробовал другой метод, например this (для выходного файла), но потерпел неудачу, конечно, с модификацией.
Вот мой текущий скрипт:
@echo off
title G++ Compiler (MinGW - GCC 8.2.0)
pushd "%~DP0"
set "MINGW_PATH=%CD%\mingw\bin"
set "PATH=%PATH%;%MINGW_PATH%"
set "OUTPUT_FOLDER=output"
:: Autopick output file name if multiple input files were detected?
:: Invalid autopick value will be assumed as "false"
:: true = Make the first input file name as output file name
:: false = Prompt the user to choose the output file name
set "AUTOPICK=false"
if "%~1"=="" (
echo\
echo ERROR: No input file^(s^) detected! Please drag and
echo drop your source code file^(s^) to begin compiling.
echo An output file will be saved to "output" folder.
pause
exit /B
)
set "OUTPUT_FILE=%~n1"
if not "%~2"=="" if not "%AUTOPICK%"=="true" (
for /F %%F in (%*) do (
:question
echo\
echo WARNING: Multiple input files were detected.
set /P "CHOICE=Set "%%~nF.exe" as output file (Y/N)? "
if not "%CHOICE%"=="Y" if not "%CHOICE%"=="N" (
if not "%CHOICE%"=="y" if not "%CHOICE%"=="n" (
cls
goto question
)
)
if "%CHOICE%"=="Y" (
set "OUTPUT_FILE=%%~nF"
goto skip
)
if "%CHOICE%"=="y" (
set "OUTPUT_FILE=%%~nF"
goto skip
)
)
rem If %CHOICE% was set to N/n, it should prompt the user
rem to choose the next output file name but it is not, it
rem will continue to the ":skip" section. Also, setting
rem %CHOICE% to a random value doesn't make it go back to
rem the ":question" section
)
:skip
cls
echo\
echo "g++.exe" %* -o "%OUTPUT_FOLDER%\%OUTPUT_FILE%.exe" -static
if not "%ERRORLEVEL%"=="0" (
echo\
pause
exit /B
)
exit /B
Необязательно : я также хочу, чтобы скрипт проверял наличие %~3
, %~4
и т. Д., Даже если %~2
пусто.Если %~3
, %~4
, ... существуют (не пустые), сценарий также предложит пользователю вопрос вместо создания выходного файла в виде %~n1
.
Обратите внимание, что я 'Я новичок в программировании на C ++ (и в пакетном режиме), поэтому не просите меня написать программу на C ++, чтобы сделать это вместо этого.
EDIT 1 (я все еще не мог заставить ее работать):
@echo off
title G++ Compiler (MinGW - GCC 8.2.0)
pushd "%~DP0"
set "MINGW_PATH=%CD%\mingw\bin"
set "PATH=%PATH%;%MINGW_PATH%"
set "OUTPUT_FOLDER=output"
:: Autopick output file name if multiple input files were detected?
:: Invalid "autopick" value will be assumed as "false"
:: true = Make the first input file name as output file name
:: false = Prompt the user to choose the output file name
set "AUTOPICK=false"
if "%~1"=="" (
echo\
echo ERROR: No input file^(s^) detected! Please drag and
echo drop your source code file^(s^) to begin compiling.
echo An output file will be saved to "output" folder.
pause
exit /B
)
setlocal EnableDelayedExpansion
set "OUTPUT_FILE=%~n1"
if not "%~2"=="" if not "%AUTOPICK%"=="true" (
for /F %%F in (%*) do (
set "CURRENT_FILE=%%~nF"
echo\
echo WARNING: Multiple input files were detected.
choice /N /M "Set "!CURRENT_FILE!.exe" as output file (Y/N)? "
if "!ERRORLEVEL!"=="1" (
set "OUTPUT_FILE=!CURRENT_FILE!"
call :proceed
)
)
)
:proceed
cls
echo\
echo "g++.exe" %* -o "%OUTPUT_FOLDER%\!OUTPUT_FILE!.exe" -static
if not "%ERRORLEVEL%"=="0" (
echo\
pause
exit
)
exit