在批处理文件中使用日期命令时,错误级别不起作用

时间:2019-05-22 13:46:47

标签: date batch-file

我已经编写了此代码来更改日期。但是当我输入错误的日期时,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

2 个答案:

答案 0 :(得分:3)

如果将DATE命令的输入重定向到nul,您仍然会收到错误消息并提示输入有效日期,但是该命令立即失败,并显示相应的错误返回码。

我发现使用&&||来处理成功和失败要比使用IF容易得多。

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

答案 1 :(得分:2)

:1:2 2重命名标签:lab1:lab,然后删除这些行:

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