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

Posted

技术标签:

【中文标题】批处理文件:(此时出乎意料【英文标题】:Batch File: ( was unexpected at this time 【发布时间】:2013-06-29 01:24:21 【问题描述】:

我收到此错误:

(此时出乎意料

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

【问题讨论】:

如果你打开回声(第一行),你看到什么有用的东西吗? 【参考方案1】:

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

例如。

IF [%checkresult%]=1 GOTO INVALID

这会抛出“此时=1 是意外的。”

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

IF [%checkresult%]==1 GOTO INVALID

【讨论】:

【参考方案2】:

哦,亲爱的。几个小问题...

正如其他人所指出的,您需要引用以防止出现空/包含空格的条目,并使用 !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! if 在延迟扩展的块语句中)

第二个问题是在某些 Windows 版本上(尽管 W7 似乎“修复”了这个问题)任何标签 - 包括 :: comment (这是一个损坏的标签)都会终止任何“块” - 即括号内的化合物声明)

【讨论】:

+1 关于 hack 标签 cmets 的要点。这里有一个关于奇怪标签评论行为的有趣讨论:dostips.com/forum/viewtopic.php?f=3&t=4204 @David 有趣的讨论,但我会拒绝 :: 是一个失败的日志驱动器开关的想法。如果是,它应该在块之外产生错误。尽管学术论点可能很有趣,但遗憾的是,关于标签/::-cmets 定位的规则和规定似乎超出了当今普通或临时批处理人员的注意力范围,并且在维护过程中可能出现破损,这使得“聪明”的使用对我来说太危险了品尝。也不确定这种情况是否与版本有关。为了理智,我会坚持无标签/::-cmets-in-a-block 哲学。 我同意你的看法。由于其未定义的行为,应始终避免在括号内使用 Hack 标签 cmets。讨论只针对那些想了解更多关于这些行为以及为什么使用它们不好的人。 :: for 循环中的注释是我的问题。这是我搜索中出现的第一个项目。谢谢!【参考方案3】:

你的三个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

【讨论】:

是的,这是一个很好的答案! @Endoro 您的回答解决了我花费数小时时间的问题。谢谢!【参考方案4】:

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

【讨论】:

"%var%"=="expected"

以上是关于批处理文件:(此时出乎意料的主要内容,如果未能解决你的问题,请参考以下文章

错误:“|”此时出乎意料的批处理脚本

在带有 %var% 的 IF 命令行上出现“(此时意外。”的原因是啥?

奇怪的IncrediBuild错误:Files Java jre1.8.0_161 bin“”==“”此时出乎意料

此时变量出乎意料

“这个时候出乎意料。”

这次批处理脚本出乎意料