Почему ЕСЛИ не возвращает сообщение? - PullRequest
0 голосов
/ 19 октября 2019

У меня есть командный файл, скажем, он называется batch_file.bat. Он содержит следующее содержимое:

@echo off & @setlocal enableextensions enabledelayedexpansion
set seconds_test=%1
set /a seconds_test=seconds_test +1
ping localhost -n !seconds_test! >nul
if !errorlevel! equ 1 echo Invalid seconds.

Когда я его запускаю:

C:\Users\User\Desktop>batch_file.bat 3

Работает и ждет 3 секунды. Но когда я запускаю:

C:\Users\User\Desktop>batch_file.bat invalid_number

Это ничего не возвращает. Моя первоначальная идея заключалась в том, чтобы вернуть неверный номер. Как и почему это происходит?

1 Ответ

0 голосов
/ 19 октября 2019

Если% 1 не является целым числом, то set /a seconds_test=seconds_test +1 установит значение секундной_тесты (или задержки_секунд) равным 1, поскольку остальная часть оператора set отбрасывается из-за переключателя /a.

@echo off & @setlocal enableextensions enabledelayedexpansion
set seconds_test=%1
set /a seconds_test=seconds_test +1
set seconds_test

batch_file.bat a возвращает:

seconds_test=1

Таким образом, команда ping пингуется один раз без ошибок. Вот как я бы проверил ввод:

@echo off & @setlocal enableextensions enabledelayedexpansion

:: check that something was entered
if "%~1"=="" (
   echo.
   echo You didn't enter any seconds
   echo Nothing to do, press any key to exit
   echo.
   pause >nul
   goto :eof
)

:: check for non-numbers in the input
echo %1|findstr /i /r "[^0-9]" >nul&&echo.&&echo %1 is not a valid number of seconds.&&echo.&&echo Press any key to exit . . .&&pause>nul&&goto :eof

set seconds_test=%1

:: check for leading zero
if "%seconds_test:~0,1%"=="0" (
   rem but zero by itself is ok
   if not "%seconds_test%"=="0" (
      echo.
      echo You entered %1.
      echo Please don't use leading zeros.
      echo.
      echo Press any key to exit
      echo.
      pause >nul
      goto :eof
   )
)

:: if we make it here, then the input should be an actual number.
set /a delay_seconds=seconds_test + 1
ping localhost -n !delay_seconds! >nul

Есть много вещей, на которые стоит обратить внимание. Я использую goto: eof, где вам может понадобиться выход. Я делаю паузу для отображения ошибок, где вам может понадобиться выполнение, чтобы просто продолжить. Я не знаю, что это особенно элегантно, или если могут быть проблемы, с которыми я не сталкивался / не сталкивался. @Compo может иметь более эффективные способы проверки ввода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...