use*_*289 14 cmd if-statement batch-file
我收到此错误:
(此时出乎意料
接受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
Run Code Online (Sandbox Code Playgroud)
Dav*_*ann 25
您正在收到该错误,因为在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
Run Code Online (Sandbox Code Playgroud)
您在所有三个if语句中都需要双引号,例如:
IF "%a%"=="2" (
Run Code Online (Sandbox Code Playgroud)
@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
Run Code Online (Sandbox Code Playgroud)
噢亲爱的.一些小问题......
正如其他人所指出的,您需要引用以防止空/包含空格的条目,并使用!delayed_expansion!设施.
您应该注意的另外两件事:
首先,set/p将为变量分配用户输入值.这不是新闻 - 但问题是按下enter响应将保留变量UNCHANGED - 它不会为变量分配零长度字符串(因此从环境中删除变量.)安全方法是:
set "var="
set /p var=
Run Code Online (Sandbox Code Playgroud)
当然,如果你不想enter重复现有的价值.
另一种有用的形式是
set "var=default"
set /p var=
Run Code Online (Sandbox Code Playgroud)
要么
set "var=default"
set /p "var=[%var%]"
Run Code Online (Sandbox Code Playgroud)
(提示使用默认值; !var!如果在带有delayedexpansion的块语句中)
第二个问题是在一些Windows版本上(虽然W7似乎"修复"了这个问题)任何标签 - 包括一个:: comment(这是一个破碎的标签)将终止任何"阻止" - 即括号化合物声明)