Файл продолжает удаляться - PullRequest
0 голосов
/ 03 апреля 2020

У меня проблемы с моей пакетной программой, в которой у меня есть 2 if операторов, один из которых позволяет пользователю добавить комментарий в файл журнала, а другой if оператор удаляет файл журнала вместе.

Пользователь сам выбирает, какую опцию он выберет, но когда я запускаю файл, кажется, что он удаляет мой файл журнала, даже если я ввожу опцию 1, чтобы добавить комментарий к файлу журнала, а не удалить его.

echo loggedTime = %time% %date%>> log.txt

REM This is for the 2 scenarios the user has to choose from

echo Please make your choice:

set /p choice1=

REM This takes the user's input and adds it to the end of the text file

IF %choice1%== 1 echo Please enter your comment:

set /p comment=

echo %comment%>> log.txt

REM this deletes the log file altogether

IF %choice1%== 2 echo The log file is being deleted

cd C:\Users\.....

del log.txt

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

Интерпретатор команд читает каждую строку в сценарии, если вы не структурируете свой сценарий таким образом, чтобы это предотвратить.

Этот наиболее распространенный способ достижения этого - использование блоков кода (строки кода, содержащиеся в круглые скобки) и метки для «пропуска» строк. При получении пользовательского ввода через set / p вам нужен метод для его проверки и возврата для нового ввода, если ввод не соответствует условным тестам, которые вы используете.

Есть еще лучший способ достичь все эти пункты, и это объединяет команду Choice с метками в виде подпрограмм следующим образом:

@Echo off
Goto :main
REM Script break created by the label Jump

REM Subroutines
:Choice[1]
    Echo(loggedTime = [%time% %date%]>>"%temp%\Mylog.txt"
    set /p comment=Comment:
    echo("%comment%">>"%temp%\Mylog.txt"
    Exit /B
:Choice[2]
    del "%temp%\Mylog.txt"
    Exit /B
:Choice[3]
    IF exist "%temp%\Mylog.txt" (TYPE "%temp%\Mylog.txt")
    Exit /B

REM main body of the script
:main
REM /N : Hide options prompt
REM /C : Define options (options will be assigned errorlevel according to occurance after /C switch)
REM /M "prompt string" : Define Custom prompt for the choice
    CHOICE /N /C cdv /M "add (C)omment (D)elete Log (V)iew Log"
REM Calls the selected subroutine. Exit /B within the Subroutine resumes the script from after the call
    CALL :Choice[%errorlevel%]
    pause
    Exit /B
0 голосов
/ 03 апреля 2020

Ваша проблема заключается в том, как DOS… err, CMD, работает с блоками IF / ELSE. Краткая форма: если условие IF разрешено как true, остальная часть строки выполняется, в противном случае она пропускается. Затем выполнение переходит к следующей строке, независимо от того, было ли значение IF истинным или ложным.

Итак, обе ваши строки set /p choice1= и del log.txt выполняются каждый раз. Я немного изменил ваш сценарий, чтобы быть уверенным в этом:

@ECHO OFF

echo loggedTime = %time% %date%>> log.txt

REM This is for the 2 scenarios the user has to choose from

echo Please make your choice:

set /p choice1=

ECHO #%choice1%#

REM This takes the user's input and adds it to the end of the text file

IF %choice1%== 1 echo Please enter your comment:

set /p comment=

ECHO #%comment%#

echo %comment%>> log.txt

REM this deletes the log file altogether

IF %choice1%== 2 echo The log file is being deleted

del log.txt

В следующих постах будет объяснено немного больше и показано, как работать с несколькими условными операторами:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...