Вы просто забыли обернуть свои переменные в %
при их использовании.
однако вам не помешает использовать хорошую практику переноса команд 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.
Кроме того, вы можете написать это более обобщенно, а неиметь любые переменные с множественным выбором, повторно используя логику функции выбора каждый раз как вызываемую функцию, и позволяя вам писать менее повторяющийся и меньший код занимаемой площади.