Дополнительно
Пакетный файл: ( был неожиданным в это время
Я получаю эту ошибку:
( было неожиданно в это время
Ошибка возникает после принятия значения a. Я попытался проверить нулевые значения, которые могли бы вызвать такую проблему, но безуспешно.
echo off
cls
title ~USB Wizard~
echo What do you want to do?
echo 1.Enable/Disable USB Storage Devices.
echo 2.Enable/Disable Writing Data onto USB Storage.
echo 3.~Yet to come~.
set "a=%globalparam1%"
goto :aCheck
:aPrompt
set /p "a=Enter Choice: "
:aCheck
if "%a%"=="" goto :aPrompt
echo %a%
IF %a%==2 (
title USB WRITE LOCK
echo What do you want to do?
echo 1.Apply USB Write Protection
echo 2.Remove USB Write Protection
::param1
set "param1=%globalparam2%"
goto :param1Check
:param1Prompt
set /p "param1=Enter Choice: "
:param1Check
if "%param1%"=="" goto :param1Prompt
if %param1%==1 (
REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\StorageDevicePolicies\ /v WriteProtect /t REG_DWORD /d 00000001
echo USB Write is Locked!
)
if %param1%==2 (
REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\StorageDevicePolicies\ /v WriteProtect /t REG_DWORD /d 00000000
echo USB Write is Unlocked!
)
)
pause
14
3
Вы получаете эту ошибку, потому что когда операторы
param1
if оцениваются, param всегда null из-за того, что это скопированные переменные без отложенного расширения.Когда используются круглые скобки, все команды и переменные внутри этих скобок расширяются. И в это время param1 не имеет значения, что делает операторы if недействительными. При использовании отложенного расширения переменные расширяются только при фактическом вызове команды.
Также я рекомендую использовать команду
if not defined
для определения того, установлена ли переменная.О, Боже. Несколько маленьких проблем...
Как указывали другие, вам нужно заключить в кавычки, чтобы защитить от пустых/содержащих пробелы записей, и использовать средство !delayed_expansion!.
Еще два вопроса, о которых вы должны знать:
Во-первых,
set/p
присвоит переменной значение, введенное пользователем. Это не новость - но проблема в том, что нажатиеenter
в ответ оставит переменную неизменной - оно не присвоит переменной строку нулевой длины (следовательно, удалит переменную из среды). Безопасный метод следующий:Это, конечно, если вы не хотите, чтобы
enter
повторил существующее значение.Другой полезной формой является
или
(который подсказывает значение по умолчанию;
!var!
если в блочном операторе с отложенным расширением)Вторая проблема заключается в том, что в некоторых версиях Windows (хотя W7, похоже, "исправила" эту проблему) ЛЮБАЯ метка, включая
:: комментарий
(который является сломанной меткой), завершает любой 'блок' - то есть составное утверждение со скобками).вам нужны двойные кавычки во всех ваших трех утверждениях
if
, например..: