Пакетный инструмент выходит из строя при входе в систему

#batch-file

#пакетный файл

Вопрос:

Поэтому, когда я открываю свой пакетный инструмент и захожу в систему, он просто вылетает. Кто-нибудь знает, почему? Всякий раз, когда я предоставляю неверные учетные данные, он сообщает: «Введенные вами учетные данные неверны, попробуйте еще раз». (что правильно) Но всякий раз, когда я ввожу user = root и pass = root, он закрывает / выводит из строя мой пакетный файл.

 @echo off
chcp 65001 >nul
:login
cls
color D
title Multi Tool
echo.
REM echo ██████╗ ██╗      ██████╗  ██████╗ ███╗   ███╗███████╗
REM echo ██╔══██╗██║     ██╔═══██╗██╔═══██╗████╗ ████║██╔════╝
REM echo ██████╔╝██║     ██║   ██║██║   ██║██╔████╔██║███████╗
REM echo ██╔══██╗██║     ██║   ██║██║   ██║██║╚██╔╝██║╚════██║
REM echo ██████╔╝███████╗╚██████╔╝╚██████╔╝██║ ╚═╝ ██║███████║
REM echo ╚═════╝ ╚══════╝ ╚═════╝  ╚═════╝ ╚═╝     ╚═╝╚══════╝  
REM echo.          
echo Login here
echo.
set /p user=Enter username:
echo.
set /p pass=Enter password:
if %user% == root if %pass% == root goto main
echo.
echo The credentials you entered are incorrect, try again.
timeout 3 >nul
goto login
:main
cls
REM echo.
REM echo ██████╗ ██╗      ██████╗  ██████╗ ███╗   ███╗███████╗
REM echo ██╔══██╗██║     ██╔═══██╗██╔═══██╗████╗ ████║██╔════╝
REM echo ██████╔╝██║     ██║   ██║██║   ██║██╔████╔██║███████╗
REM echo ██╔══██╗██║     ██║   ██║██║   ██║██║╚██╔╝██║╚════██║
REM echo ██████╔╝███████╗╚██████╔╝╚██████╔╝██║ ╚═╝ ██║███████║
REM echo ╚═════╝ ╚══════╝ ╚═════╝  ╚═════╝ ╚═╝     ╚═╝╚══════╝  
REM echo.
echo Welcome to the main tool
 

Комментарии:

1. Когда вы используете метод выполнения пакета «укажи, щелкни и хихикай», окно пакета закроется, если будет обнаружена синтаксическая ошибка или сценарий будет запущен до завершения. Вместо этого вы должны открыть «командную строку» и запустить свой пакет оттуда, чтобы окно оставалось открытым и отображались любые сообщения (об ошибках).

2. Но ошибок никаких нет

3. @Lunar — Все работает нормально , в чем проблема?

Ответ №1:

На самом деле это не ответ на ваш вопрос, но включает Pause команду внизу, чтобы предотвратить ее закрытие при вызове через графический интерфейс.

Это больше для того, чтобы показать вам, что вы должны использовать Call команду с именем метки всякий раз, когда хотите показать свой арт / баннер.

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

Я также добавил правило трех зачеркиваний для username запросов ввода и password ввода. Мне кажется, это разумная идея, поскольку любой конечный пользователь, который не может исправить ее с трех попыток, вероятно, не должен ее использовать.

 @Echo Off
SetLocal EnableExtensions
Title Multi Tool
Color 0D
GoTo login

:banner
For /F "Delims==" %%G In ('"(Set _cp) 2> NUL"') Do Set "%%G="
For /F Tokens^=* %%G In ('"%SystemRoot%System32chcp.com"') Do For %%H In (%%G
) Do Set "_cp=%%~nH"
If Not %_cp% Equ 65001 (Set "_cpc=TRUE"
    "%SystemRoot%System32chcp.com" 65001 1> NUL)
Echo=
Echo ██████╗ ██╗      ██████╗  ██████╗ ███╗   ███╗███████╗
Echo ██╔══██╗██║     ██╔═══██╗██╔═══██╗████╗ ████║██╔════╝
Echo ██████╔╝██║     ██║   ██║██║   ██║██╔████╔██║███████╗
Echo ██╔══██╗██║     ██║   ██║██║   ██║██║╚██╔╝██║╚════██║
Echo ██████╔╝███████╗╚██████╔╝╚██████╔╝██║ ╚═╝ ██║███████║
Echo ╚═════╝ ╚══════╝ ╚═════╝  ╚═════╝ ╚═╝     ╚═╝╚══════╝
Echo=
If Defined _cpc ("%SystemRoot%System32chcp.com" %_cp% 1> NUL
    For /F "Delims==" %%G In ('Set _cp') Do Set "%%G=")
Exit /B

:login
ClS
Call :banner
Echo Login here.
Set "i=0"
Echo=

:getuser
Set /A i  = 1
Set "user="
Set /P "user=Enter username: "
Set "user=%user:"=%"
If /I Not "%user%" == "root" If %i% Lss 3 (GoTo getuser
) Else (Echo=
    Echo The username you entered is incorrect, exiting.
    %SystemRoot%System32timeout.exe /T 3 1> NUL
    GoTo :EOF)
Set "i=0"
Echo=

:getpass
Set /A i  = 1
Set "pass="
Set /P "pass=Enter password: "
Set "pass=%pass:"=%"
If /I Not "%pass%" == "root" If %i% Lss 3 (GoTo getpass
) Else (Echo=
    Echo The credentials you entered are incorrect, try again.
    %SystemRoot%System32timeout.exe /T 3 1> NUL
    GoTo login)
Set "i="
Echo=

:main
ClS
Call :banner
Echo Welcome to the main tool.
Echo=

Pause