Пакетный - ЕСЛИ ОШИБКА с командой net user
Мне нужна помощь с партией. Я создал этот командный файл, используя операторы условной обработки для обнаружения ошибок. Для этого командного файла НЕ должно оставаться НИКАКИХ символов условной обработки. Мне нужно удалить их и использовать IF ERRORLEVEL для обнаружения ошибок. Мы не можем использовать "IF %ERRORLEVEL%" или что-то более сложное, мы просто находимся на начальном этапе. Нам также нужно использовать команду net user. Я застрял.
Исходный код, который работает с операторами условной обработки:
@echo off
rem Check if the account already exists before creating account. If it does not exist, go to :FAIL
net user | find /i "%1" >nul 2>&1 && GOTO FAIL
rem Add a user if the account does not exist and then go to :SUCCESS
net user %1 %1 /add >nul 2>&1 || GOTO ERROR
GOTO SUCCESS
rem If the user does not already exist and is succesfully added
:SUCCESS
echo The %1 user was succesfully added.
GOTO :EOF
rem If the user already exists
:FAIL
echo The %1 user already exists on this computer.
echo Please use a different username.
GOTO :EOF
rem Send system generated errors messages to ECHO
:ERROR
echo An Error was generated when attempting to create the user
echo These are the things you can check:
echo Did you open the command prompt as administrator?
echo If passwords are required on your system, did you include one?
GOTO :EOF
:END
Что я знаю:
- Если учетная запись уже существует, уровень ошибки равен 0.
- Если учетная запись не существует, но создана, уровень ошибки равен 0.
- Если командная строка не запускается от имени администратора или политика паролей не
выполняется, уровень ошибки равен 2.
На самом деле я ничего из этого не знаю, потому что похоже, что мой уровень ошибок меняется по мере того, как я экспериментирую... Я застрял... Одна из командных подсказок я получал уровень ошибки 1, так что... также GOTO: Условная обработка EOF?
Как мне выполнить этот сценарий? Я застрял. Пробовал кое-что, но в итоге застрял. Вот что у меня есть, от чего я отказался.
Код, который у меня нет, без операторов условной обработки и IF ERRORLEVEL:
@echo off
IF ERRORLEVEL 2 (
rem Send system generated errors messages to ECHO
echo An Error was generated when attempting to create the user
echo These are the things you can check:
echo Did you open the command prompt as administrator?
echo If passwords are required on your system, did you include one?
GOTO :EOF
)
:: Check if the account already exists before creating account. If it does not exist, go to :FAIL
net user | find /i "%1"
IF ERRORLEVEL 0 (
rem If the user already exists
echo The %1 user already exists on this computer.
echo Please use a different username.
GOTO :EOF
)
:: Add a user if the account does not exist and then go to :SUCCESS
net user %1 %1 /add
IF ERRORLEVEL 0 (
REM If the user does not already exist and is succesfully added
echo The %1 user was succesfully added.
GOTO :EOF
)
:END
2 ответа
Вместо того, чтобы пытаться создать пользователя, используя net.exe
с user
command, а затем попытайтесь решить любые проблемы, связанные с этим; Я бы предложил следующий подход с использованием встроенной утилиты командной строки WMI wmic. Идея состоит в том, чтобы сравнить ваше входное имя пользователя со списком всех существующих стандартных локальных пользователей (которые не являются встроенными / специальными) и продолжить, только если дублирующееся имя пользователя еще не существует.
@If "%~1"=="" (Echo No username provided as an input argument.
"%__AppDir__%timeout.exe" 3 /NoBreak>NUL&GoTo :EOF)
@SetLocal DisableDelayedExpansion
@Set "Usr=%~1"
@Call :UsrsLst "%Usr%"
@If ErrorLevel 2 (Echo The username already exists.
"%__AppDir__%timeout.exe" 3 /NoBreak>NUL&GoTo :EOF
)Else If ErrorLevel 1 Echo You have no existing standard local users.
@If ErrorLevel 0 Echo Creating user %Usr% . . .
@"%__AppDir__%timeout.exe" 3 /NoBreak>NUL
@EndLocal&GoTo :EOF
:UsrsLst
@For /F "Delims==" %%G In ('Set Usrs 2^>NUL')Do @Set "%%G="
@For /F Tokens^=2Delims^=^" %%G In ('^""%__AppDir__%wbem\WMIC.exe"^
Path Win32_UserProfile Where "Special!='True' And LocalPath Is Not Null"^
Assoc:List 2^>NUL^"')Do @For /F Tokens^=4Delims^=^" %%H In (
'^""%__AppDir__%wbem\WMIC.exe" UserAccount Where "SID='%%G'" Assoc:List^
/ResultRole:Name 2^>NUL^"')Do @If Not Defined Usrs (Set Usrs="%%H"
)Else Call Set "Usrs=%%Usrs%% "%%H""
@Set Usrs 2>NUL|"%__AppDir__%findstr.exe"/LI "\"%~1\"">NUL&&(Exit/B 2)||(
If Not Defined Usrs (Exit/B 1) Else Exit/B 0)
Существующая линия 10
включен только для демонстрационных целей, вы должны заменить эту строку только остальной частью вашего скрипта. т.е. код для фактического создания вашей новой учетной записи пользователя и любых последующих процессов проверки.
Вы не должны ничего изменять, кроме следующей рекомендации. Между строк4
а также 5
выполните некоторую проверку входного аргумента, прежде чем продолжить выполнение сценария. Это был бы намного лучший подход, который пытается просто зафиксировать ошибку после попытки создания вашей учетной записи.
Например, вот некоторые общие реквизиты для имени пользователя Windows:
- Предоставленное имя пользователя должно состоять как минимум из одного символа, но не более чем из двадцати символов.
- Предоставленное имя пользователя не должно состоять исключительно из точек или пробелов.
- Предоставленное имя пользователя не может содержать ни один из следующих символов:
*/\[]: ;I=,+?<>"@
.
Единственный раз, когда при создании пользователя возникает ошибка, это сразу после попытки создания пользователя, поэтому проверка ошибок должна быть перенесена в эту часть кода. Однако, посколькуif ERRORLEVEL 0
означает "если ERRORLEVEL 0 или выше", а 2 больше 0, необходимо переместить IF ERRORLEVEL 2
кодовый блок между net user add
и последний IF ERRORLEVEL 0
линии. Кроме того, вы хотитеnet user
не удалось, поэтому нам нужно перенаправить поток скрипта перед if errorlevel 0
подбирается.
@echo off
:: Check if the account already exists before creating account.
net user "%~1"
IF ERRORLEVEL 2 GOTO ADD_USER
IF ERRORLEVEL 0 (
rem If the user already exists
echo The %1 user already exists on this computer.
echo Please use a different username.
GOTO :EOF
)
:: Add a user if the account does not exist and then go to :SUCCESS
:ADD_USER
net user %1 %1 /add
IF ERRORLEVEL 2 (
rem Send system generated errors messages to ECHO
echo An Error was generated when attempting to create the user
echo These are the things you can check:
echo Did you open the command prompt as administrator?
echo If passwords are required on your system, did you include one?
GOTO :EOF
)
IF ERRORLEVEL 0 (
REM If the user does not already exist and is succesfully added
echo The %1 user was succesfully added.
GOTO :EOF
)
:END
В формулировке вашего домашнего задания упоминаются только символы условной обработки, а не вся условная обработка в целом, так что это просто означает, что вы не можете использовать||
или &&
.