Цикл for не зацикливает себя и продолжает вместо - PullRequest
0 голосов
/ 21 сентября 2019

Я хочу создать автоматический пакетный скрипт, который может компилировать и связывать (несколько) файл исходного кода 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...