Преобразование пакетного скрипта с GOTO в одну строку - PullRequest
0 голосов
/ 24 августа 2018

Я знаю, что здесь нужно использовать «&» и «&&». Но как насчет GOTO? Как заставить работать с надписями или без? Я хочу, чтобы это выглядело, например, так: echo% time% & dir & echo% time%.

@echo off
:start
cls
echo -create (create password)
echo -check (check password)
echo.
set /p PROGRAM= What do you want to do?: 
goto %PROGRAM%

:create
cls
set /p PASSWORD= What do you want your password to be?: 
echo %PASSWORD% > test.txt
pause
goto start

:check
cls
set /p PASSWORD1= What is your password?

for /f "Delims=" %%a in (test.txt) do (
set TEXT=%%a
)

if %PASSWORD1%==%TEXT% goto correct
echo you are wrong!!!
pause
goto start

:correct
echo you are right!!!
pause
goto start

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Вот как я бы это сделал:

for /L %a in () do ( 
    cls
    & echo 1- Create password
    & echo 2- Check password
    & echo/
    & choice /N /C 12 /M "What do you want to do? "
    & cls 
    & (if not errorlevel 2 (
        set /p "pass=What do you want your password to be?: "
        & (call echo %%pass%%)>test.txt
    ) else (
        set /p "pass=What is your password? "
        & (call echo %%pass%%)>text.txt
        & fc test.txt text.txt >nul
        & if not errorlevel 1 (
            echo You are right !!!
        ) else (
            echo You are wrong !!!
        )
    ))
    & echo/ & pause 
)

Это однострочная версия, которую вы должны указать в командной строке:

for /L %a in () do (cls & echo 1- Create password & echo 2- Check password & echo/& choice /N /C 12 /M "What do you want to do? " & cls & ( if not errorlevel 2 (set /p "pass=What do you want your password to be?: " & (call echo %^pass%)>test.txt) else (set /p "pass=What is your password?: " & (call echo %^pass%)>text.txt & fc test.txt text.txt >nul & if not errorlevel 1 (echo You are right !!!) else (echo You are wrong !!!)) ) & echo/ & pause)

Для того, чтобывыполните эту строку в вызове cmd.exe, просто заключите всю строку в кавычки:

cmd /C "for /L %a in () do ( ... pause)"

Проще использовать команду choice для выбора опции.Кроме того, это также позволяет использовать форму if errorlevel, которая не требует отложенного расширения ... То же самое относится к сравнению пароля с помощью команды fc.

Протестировано в Windows 8.1

0 голосов
/ 24 августа 2018

К сожалению, как уже отмечалось, невозможно использовать метки в командной строке.

В рамках вашего вопроса ваш лучший вариант - заключить каждую из подпрограмм в команды if / else и заменить цикл на начало бесконечным циклом. Итак, вы заканчиваете чем-то вроде этого («читаемый» прототип)

for /l %a in (0) do ( 
    cls
    & echo -create (create password)
    & echo -check (check password)
    & echo/
    & set pass=
    & set p=
    & set /p p=What do you want to do?
    & cls 
    & (if !p!==create (
        set /p pass=What do you want your password to be?:
        & (echo !pass!)>test.txt
    ) else if !p!==check (
        set /p pass=What is your password?
        & set /p text=<test.txt 
        & if !pass!==!text! (
            echo You are right !!!
        ) else (
            echo You are wrong !!!
        )
    ) else (
        echo wrong command !!!
    ))
    & echo/ & pause 
)

Примечания:

  • goto :start теперь представляет собой бесконечный цикл for /l.
  • Каждая команда, являющаяся продолжением предыдущей, нуждается в операторе &. Первая команда внутри блока if или else не должна иметь ее.
  • Поскольку мы меняем переменные и извлекаем измененное значение внутри одной и той же строки, нам нужно будет использовать отложенное расширение (!var!).
  • Поскольку отложенное расширение будет использоваться в командной строке, нам нужно будет включить некоторые ключи в cmd call

Теперь, когда все в строке:

cmd /e /v /c"for /l %a in (0) do ( cls & echo -create (create password) & echo -check (check password) & echo/ & set pass= & set p= & set /p p=What do you want to do? & cls & (if !p!==create ( set /p pass=What do you want your password to be?: & (echo !pass!)>test.txt ) else if !p!==check ( set /p pass=What is your password? & set /p text=<test.txt & if !pass!==!text! ( echo You are right !!! ) else ( echo You are wrong !!! ) ) else ( echo wrong command !!! )) & echo/ & pause )"

/e (включить расширения, обычно уже включены, но на всякий случай), /v (включить отложенное расширение) включены, чтобы обеспечить создание нового экземпляра cmd с требуемой конфигурацией.

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

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