Скрипт на CMD выдаёт ошибку по операнду. Где я допустил ошибку?
Приветствую, друзья!
Давным давно, от скуки писал небольшой скрипт (который, как ни странно работал) для автоматического отключения компьютера с возможностями ввода переменных (часов и минут) и отмены обратного отсчета. Спустя года попробовал им воспользоваться, но что-то пошло не так.
Пожалуйста, подскажите, где я долпустил ошибку?
ECHO OFF
ECHO SHUTDOWN SYSTEM
set /p H="HOURS: "
set /p M="MINUTES: ", 0
if not defined %H% and %M% (GOTO 20)
if defined %H% and %M% (GOTO 10)
if defined %H% or %M% (GOTO 10)
:10
set /a H1 = %H% * 3600
set /a M1 = %M% * 60
echo %H1%
echo %M1%
set /a TOTAL = %H1% + %M1%
ECHO %TOTAL%
SHUTDOWN -S -T %TOTAL%
pause
EXIT
:20
SHUTDOWN -A
pause
EXIT
pause
В вашем скрипте есть несколько ошибок и недочетов, которые могут вызывать проблемы. Давайте разберем их и исправим.
### Ошибки и исправления
1. **Проверка переменных**: В вашем коде используется неправильный синтаксис для проверки переменных. Вместо `if not defined %H% and %M%` нужно использовать `if not defined H` и `if not defined M`. Также логические операторы `and` и `or` не поддерживаются в `cmd`. Вместо этого можно использовать вложенные условия.
2. **Пробелы в арифметических операциях**: В выражениях `set /a H1 = %H% * 3600` и `set /a M1 = %M% * 60` не должно быть пробелов вокруг знака `=`. Правильный синтаксис: `set /a H1=%H%*3600`.
3. **Отмена обратного отсчета**: В вашем коде не совсем корректно обрабатывается логика для отмены. Нужно убедиться, что проверка на наличие значений переменных выполняется правильно.
4. **Пробелы в `ECHO`**: В некоторых случаях, если вы хотите вывести текст, лучше использовать `ECHO` без пробелов.
### Исправленный код
Вот исправленный вариант вашего скрипта:
```batch
@ECHO OFF
ECHO SHUTDOWN SYSTEM
set /p H="HOURS: "
set /p M="MINUTES: "
REM Проверка на наличие значений
if not defined H if not defined M (
GOTO 20
)
if defined H if defined M (
GOTO 10
)
if defined H (
GOTO 10
)
if defined M (
GOTO 10
)
:10
set /a H1=%H%*3600
set /a M1=%M%*60
echo %H1%
echo %M1%
set /a TOTAL=H1+M1
ECHO %TOTAL%
SHUTDOWN -S -T %TOTAL%
pause
EXIT
:20
SHUTDOWN -A
ECHO Shutdown canceled.
pause
EXIT
```
### Объяснение изменений
- Убраны пробелы в арифметических операциях.
- Исправлены условия проверки на наличие значений переменных.
- Добавлено сообщение о том, что отключение отменено, если пользователь решит отменить.
Теперь скрипт должен работать корректно. Попробуйте его запустить и проверьте, решает ли это вашу проблему.
@ECHO OFF
ECHO SHUTDOWN SYSTEM
set /p H="HOURS: "
set /p M="MINUTES: "
REM Проверка на наличие значений
if not defined H if not defined M (
GOTO 20
)
if defined H if defined M (
GOTO 10
)
if defined H (
GOTO 10
)
if defined M (
GOTO 10
)
:10
set /a H1=%H%*3600
set /a M1=%M%*60
echo %H1%
echo %M1%
set /a TOTAL=H1+M1
ECHO %TOTAL%
SHUTDOWN -S -T %TOTAL%
pause
EXIT
:20
SHUTDOWN -A
ECHO Shutdown canceled.
pause
EXIT