批处理文件:(此时出乎意料

时间:2013-07-01 20:00:31

标签: if-statement batch-file cmd

我收到此错误:

  

(此时出乎意料

接受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

4 个答案:

答案 0 :(得分:23)

您收到该错误是因为在评估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

答案 1 :(得分:9)

哦,亲爱的。一些小问题......

正如其他人所指出的,你需要引用以防止空/包含空格的条目,并使用!delayed_expansion!设施。

您应该注意的其他两个问题:

首先,set/p将为变量分配用户输入值。这不是新闻 - 但问题是按下enter作为响应将保留变量UNCHANGED - 它不会为变量分配零长度字符串(因此从环境中删除变量。)安全的方法是:

 set "var="
 set /p var=

当然,如果您不想enter重复现有价值,那就是这样。
另一种有用的形式是

 set "var=default"
 set /p var=

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

(使用默认值提示; !var!如果在带有delayedexpansion的块语句中

第二个问题是在某些Windows版本上(虽然W7似乎"修复"此问题)任何标签 - 包括:: comment(这是一个坏标签)将终止任何&# 39;块' - 即带括号的复合语句)

答案 2 :(得分: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

答案 3 :(得分:0)

如果您在 IF 语句中遇到此错误,请检查是否使用了双等于来比较您的变量。

例如

IF [%checkresult%]=1 GOTO INVALID

这会抛出“此时 =1 出乎意料。”

要更正此问题,请添加另一个等号。

IF [%checkresult%]==1 GOTO INVALID