IF ERRORLEVEL с командой пользователя net

Мне нужна помощь с партией. Я создал этот пакетный файл, используя операторы условной обработки для обнаружения ошибок. Для этого пакетного файла не должно оставаться НИКАКИХ символов условной обработки. Мне нужно удалить их и использовать «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

person Derek W    schedule 15.03.2020    source источник
comment
Примечание: if errorlevel <n> на самом деле обрабатывается так, как если бы уровень ошибки был ‹n› или выше, поэтому if errorlevel 0 на самом деле просто проверяет, не является ли уровень ошибки отрицательным. Вы, вероятно, хотите if not errorlevel 1   -  person Stephan    schedule 15.03.2020


Ответы (2)


Единственный раз, когда ошибка будет генерироваться при создании пользователя, будет сразу после попытки создать пользователя, поэтому проверку ошибок необходимо переместить в эту часть кода. Однако, поскольку 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

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

person SomethingDark    schedule 15.03.2020

Вместо того, чтобы пытаться создать пользователя с помощью команды user net.exe, а затем пытаться решить любые проблемы, связанные с этим, впоследствии; Я бы предложил следующий подход с использованием встроенной утилиты командной строки 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=,+?<>"@ .
person Compo    schedule 16.03.2020