Мой сценарий не будет перенаправлять на другие мои классы? - PullRequest
0 голосов
/ 30 октября 2019

Я создал переменную и назначил ее для входа. Но что бы я ни вводил, он просто перенаправляет обратно на: EditUser. Я не знаю, почему он это делает.

Это мой код. Может кто-нибудь сказать мне, почему это не будет направлено на другие классы. Это единственное перенаправление в моем скрипте, которое не будет работать.

:EditUser
cls
echo You chose to edit a user
echo ========================
echo 1. Change Password
echo 2. Change Account Type
echo 3. Go back to Users
echo.
set /p CHOICE6=What do you want to do?
if CHOICE6==1 goto PassChange
if CHOICE6==2 goto PrivChange
if CHOICE6==3 goto Users
goto EditUser

Ответы [ 2 ]

0 голосов
/ 30 октября 2019

Вы просто забыли обернуть свои переменные в % при их использовании.

однако вам не помешает использовать хорошую практику переноса команд SET в " также

Кроме того, вы могли бы немного упростить свою жизнь, используя выбор, хотя все еще можно получить возможность ошибиться, поэтому YMMV

:EditUser
cls
echo.You chose to edit a user
echo.========================
echo.1. Change Password
echo.2. Change Account Type
echo.3. Go back to Users
echo.
set /p "CHOICE6=What do you want to do? "
IF %CHOICE6% EQU 1 goto :PassChange
IF %CHOICE6% EQU 2 goto :PrivChange
if %CHOICE6% EQU 3 goto :Users
goto :EditUser

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

CALL - это "БЕЗОПАСНО", поскольку он вернется к текущей точке выполнения функции илиокончание сценария, и вы можете лучше написать сценарий.

REM Example main function
:Main
  REM ...

  REM Call Edit User, Specify a variable name to be returned
  CALL :EditUser "CALL_THIS"

  REM Call the function we chose in the :Edit User Function and was returned to us here, and may be :PassChange, :PrivChange, :Users
  CALL %CALL_THIS% 

  REM ...
GOTO :EOF

:EditUser
REM Clear the Variable Provided to the fucntion to be returned
SET "%~1="
REM Clear the Choice
SET "CHOICE6="
cls
echo.You chose to edit a user
echo.========================
echo.1. Change Password
echo.2. Change Account Type
echo.3. Go back to Users
echo.
CHOICE /C 123 /N /M "What do you want to do? "
SET "CHOICE6=%ERRORLEVEL%"
REM Check an arbitrary number of choices without having to write a full IF on each.
FOR %%_ IN (
 1:PassChange
 2:PrivChange
 3:Users
) DO (

  REM Split choices to test them:
  FOR /F "Tokens=12 Delims=:" %%A (
    IF %%A EQU %CHOICE6% (

      REM Set The Variable given the function '%1' to a value to return to Main script when the Choice was matched.
      SET "%~1=:%%B"
    )
  )

  REM Exit Function when %~1 is defined.
  IF DEFINED %~1 GOTO :EOF
)

REM Show screen again when not matched
GOTO :EditUser

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

Но даже в тех местах, где вы неЧтобы вызвать другую функцию, вы можете использовать здесь логику цикла, чтобы сохранить список вариантов и оценить их без необходимости повторного ввода всех операторов if.

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

0 голосов
/ 30 октября 2019

Вы забыли Обернуть ваши переменные с помощью %, чтобы они распознавались как таковые. Это должно быть %CHOICE6% Кроме того, вы должны либо заключить запрос оператора if в двойные кавычки, чтобы исключить возможные пробелы if "%CHOICE6%"=="1" или даже лучше видеть его в числовом виде, используйте if %CHOICE6% equ 1

В любом случае, видя, как выработают с очевидным из Choice, тогда просто используйте выбор вместо set /p

:EditUser
cls
echo You chose to edit a user
choice /c 123 /m "Select (1) Change Password (2) change account type (3) go back to users"
goto :opt%errorlevel%

:opt1
echo change password stuff here.
goto :eof

:opt2
echo change account type stuff goes here
goto :eof

:opt3
goto :users
goto :eof

Так что на самом деле происходит то, что мы просто переходим к метке, начинающейся с opt, к которой добавляется уровень ошибки, возвращаемый choice

Также разрешено вводить только одно введенное буквенно-цифровое значение, все остальные введенные вами значения не будут применяться. Таким образом, в этом случае cmd будет действовать только на 1, 2 или 3.

Подробнее см. choice /?.

Кроме того, если вы хотите сохранить эхо-макет, а недобавить опции в одну строку, добавить эхо и удалить сообщение /m swirtch из choice:

:EditUser
cls
echo You chose to edit a user
echo ========================
echo 1. Change Password
echo 2. Change Account Type
echo 3. Go back to Users
echo(
choice /c 123
goto :opt%errorlevel%

:opt1
echo change password stuff here.
goto :eof

:opt2
echo change account type stuff goes here
goto :eof

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