Пакетная обработка - ЕСЛИ ОШИБКА С ПОМОЩЬЮ пользовательской команды net - PullRequest
0 голосов
/ 15 марта 2020

Мне нужна помощь с партией. Я создал этот пакетный файл, используя операторы условной обработки для обнаружения ошибок. Для этого пакетного файла не должно оставаться символов условной обработки. Мне нужно удалить их и использовать «IF ERRORLEVEL» для обнаружения ошибок. Мы не можем использовать «IF% ERRORLEVEL%» или что-либо продвинутое, мы только на начальной стадии. Нам также нужно использовать пользовательскую команду net. Я застрял.

Оригинальный код, который работает с операторами условной обработки:

@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?

Как мне выполнить sh этот сценарий? Я застрял. Пробовал некоторые вещи, но в конечном итоге застрял. Вот что у меня есть, от чего я отказался.

Код, который у меня есть без операторов условной обработки и 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 ]

0 голосов
/ 16 марта 2020

Вместо того, чтобы пытаться создать пользователя с помощью команды net.exe s user, а затем попытаться решить любые возникающие проблемы, впоследствии; Я бы предложил следующий подход, используя встроенную утилиту командной строки WMI . Идея состоит в том, чтобы проверить ваше введенное имя пользователя по списку всех существующих стандартных локальных пользователей, (которые не являются встроенными / специальными) , и продолжить работу только в том случае, если дублирующее имя пользователя еще не существует.

@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=,+?<>"@.
0 голосов
/ 15 марта 2020

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

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

...