Пакетный файл: ( был неожиданным в это время

Я получаю эту ошибку:

( было неожиданно в это время

Ошибка возникает после принятия значения 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
Решение

Вы получаете эту ошибку, потому что когда операторы param1 if оцениваются, param всегда null из-за того, что это скопированные переменные без отложенного расширения.

Когда используются круглые скобки, все команды и переменные внутри этих скобок расширяются. И в это время param1 не имеет значения, что делает операторы if недействительными. При использовании отложенного расширения переменные расширяются только при фактическом вызове команды.

Также я рекомендую использовать команду if not defined для определения того, установлена ли переменная.

@echo off
setlocal EnableExtensions EnableDelayedExpansion
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 not defined 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 not defined param1 goto :param1Prompt
    echo !param1!

    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
endlocal
Комментарии (0)

О, Боже. Несколько маленьких проблем...

Как указывали другие, вам нужно заключить в кавычки, чтобы защитить от пустых/содержащих пробелы записей, и использовать средство !delayed_expansion!.

Еще два вопроса, о которых вы должны знать:

Во-первых, set/p присвоит переменной значение, введенное пользователем. Это не новость - но проблема в том, что нажатие enter в ответ оставит переменную неизменной - оно не присвоит переменной строку нулевой длины (следовательно, удалит переменную из среды). Безопасный метод следующий:

 set "var="
 set /p var=

Это, конечно, если вы не хотите, чтобы enter повторил существующее значение.
Другой полезной формой является

 set "var=default"
 set /p var=

или

 set "var=default"
 set /p "var=[%var%]"

(который подсказывает значение по умолчанию; !var! если в блочном операторе с отложенным расширением)

Вторая проблема заключается в том, что в некоторых версиях Windows (хотя W7, похоже, "исправила" эту проблему) ЛЮБАЯ метка, включая :: комментарий (который является сломанной меткой), завершает любой 'блок' - то есть составное утверждение со скобками).

Комментарии (4)

вам нужны двойные кавычки во всех ваших трех утверждениях if, например..:

IF "%a%"=="2" (

@echo OFF &SETLOCAL ENABLEDELAYEDEXPANSION
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
         USB Write is Locked!
    )
    if "!param1!"=="2" (
         REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\StorageDevicePolicies\ /v WriteProtect /t REG_DWORD /d 00000000
         USB Write is Unlocked!
    )
)
pause
Комментарии (0)