Уровень ошибки не работает при использовании команды даты в пакетном файле

Я сделал этот код, чтобы изменить дату. Но когда я ввожу неправильную дату, команда errorlevel игнорируется.

@echo off
@setlocal enableextensions
@cd /d "%~dp0"
mode 48,12

:start
cls
echo.
echo 1 - Mudar data
echo 2 - Retornar a data atual
echo.
echo.
echo.
echo.
choice /n /c:12 /m "Digite uma op‡Æo:"%1
if errorlevel ==2 goto 2
if errorlevel ==1 goto 1

:1
cls
set /p "dd=Digite o dia: "
cls
set /p "mm=Digite o mes: %dd% - "
cls
set /p "aa=Digite o ano: %dd% - %mm% - "
cls
date %dd%-%mm%-%aa%
if not errorlevel 1 (
cls
echo Data modificada.
pause
goto start
)

if errorlevel 1 (
cls
echo Erro ao mudar a data.
pause
goto start
)

:2
cls
w32tm /resync >nul 2>nul
cls
goto start

Я предполагал, что если дата была введена неправильно, она будет отображаться как echo Erro ao mudar a data. Но это только открывает экран команды date с просьбой изменить дату, потому что она была введена неправильно.


Изменить 1

Просто обновите мой код, включая команды, чтобы остановить Windows Time Service, потому что даже я изменил дату, через некоторое время реальная дата снова была заменена.

@echo off
setlocal enableextensions
cd /d "%~dp0"
mode 42,12

:begin
cls
echo ------------------------------------------
echo          MUDAR A DATA DO WINDOWS
echo ------------------------------------------
echo( &echo(
echo  1 - Escolher a data & echo( &echo  2 - Retornar para a data atual
echo( & echo( &echo(
choice /n /c:12 /m "Digite uma op‡Æo:"%1
goto :lab%errorlevel%

:lab1
cls & set /p "dd=Digite o dia: "
cls & set /p "mm=Digite o mes: %dd% / "
cls & set /p "aa=Digite o ano: %dd% / %mm% / "

date %dd%/%mm%/%aa% <nul && (

    cls
    net stop w32time >nul 2>nul
    sc config w32time start= disabled >nul 2>nul
    echo Data modificada.
    timeout /nobreak /t 2 >nul 2>nul
    goto begin
) || (
      cls & echo Erro ao mudar a data.
      echo( &echo( &echo(
      pause
      goto begin
)

:lab2
net start w32time >nul 2>nul
sc config w32time start= demand >nul
cls & w32tm /resync >nul 2>&1
echo Data atual retornada.
timeout /nobreak /t 2 >nul 2>nul
cls & goto begin
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
0
218
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Переименуйте ваши ярлыки :1 и :2 в :lab1 и :lab 2, затем удалите эти строки:

if errorlevel ==2 goto 2
if errorlevel ==1 goto 1

и замените их этой строкой:

goto :lab%errorlevel%

Тогда у вас должны быть только:

choice /n /c:12 /m "Digite uma op‡Æo:"%1
goto :lab%errorlevel%

Затем другие наблюдения, удалите строки echo. и замените их на echo(cls строки сами по себе выглядят уродливо, поэтому мне нравится интегрировать их, запуская их с помощью & с другими командами, чтобы они выглядели лучше. Таким образом, общая очистка будет:

@echo off
setlocal enableextensions
cd /d "%~dp0"
mode 48,12

:begin
cls
echo( & echo 1 - Mudar data & echo 2 - Retornar a data atual
echo( & echo( &echo( &echo(
choice /n /c:12 /m "Digite uma op‡Æo:"%1
goto :lab%errorlevel%

:lab1
cls & set /p "dd=Digite o dia: "
cls & set /p "mm=Digite o mes: %dd% - "
cls & set /p "aa=Digite o ano: %dd% - %mm% - "
cls & echo %dd%-%mm%-%aa% | date
if not errorlevel 1 (
    cls
    echo Data modificada.
    pause
    goto begin
  ) else (
      cls & echo Erro ao mudar a data.
      pause
      goto start
)

:lab2
cls & w32tm /resync >nul 2>&1
cls & goto begin

Я внес изменение в ответ, чтобы устранить последствия ввода неправильной даты, которая будет ждать подсказки, и она работает с уровнем ошибок echo %dd%-%mm%-%aa% | date

Gerhard 24.05.2019 08:34
Ответ принят как подходящий

Если вы перенаправляете ввод на nul для команды DATE, вы по-прежнему получаете сообщение об ошибке и запрос на ввод допустимой даты, но затем команда немедленно завершается с ошибкой с соответствующим кодом возврата.

Я считаю, что гораздо проще использовать && и || для обработки успехов и неудач вместо использования ЕСЛИ.

date %dd%-%mm%-%aa% <nul && (
  cls
  echo Data modificada.
) || (
  cls
  echo Erro ao mudar a data.
)
pause
goto start

Хороший!! работал четко и четко! Я понял, что >nul и <nul разные. Ты можешь мне это объяснить? Я просто знал >nul или >nul 2>nul

Black Mamba 22.05.2019 20:59

@I'mNotHere >nul перенаправляет вывод на nul, где <nul перенаправляет ввод с nul

Gerhard 22.05.2019 21:05

@I'mNotHere — < перенаправляет ввод, а > перенаправляет вывод. Без номера < перенаправляет стандартный ввод, что совпадает с 0<. И > перенаправляет стандартный вывод, что совпадает с 1>

dbenham 22.05.2019 21:08

Только один последний пункт! Я не нашел, возможно ли ограничить количество символов, которые будут использоваться. Например, написав dd, я свободен писать что угодно. Но я хотел разрешить только числа и 2 символа. это возможно? только для записи например 05 (день 5)

Black Mamba 22.05.2019 21:18

@I'mNotHere - это совсем другой вопрос. Если вы покопаетесь в Интернете, вы можете найти различные стратегии для достижения этого с помощью пакетной обработки, хотя нет тривиального встроенного решения. Но я должен согласиться с комментарием Мофи — вы можете отказаться от своих подсказок и просто ввести DATE без каких-либо аргументов, и он запросит новую дату, включая подсказку с указанием правильного формата.

dbenham 22.05.2019 21:25

@I'mNotHere Совсем не сложно, можете проверить set /p "mm=Digite o mes: %dd% - " потом set test=%mm:~2,1% наконец if defined test echo you entered more than 2 digits

Gerhard 22.05.2019 21:27

Спасибо! < изменил ситуацию!

Black Mamba 23.05.2019 00:36

Другие вопросы по теме