I am getting this error:
( was unexpected at this time
The error occurs after accepting the value of a. I tried and checked for null values that could cause such a problem,, but was unsuccessful.
echo off cls title ~USB Wizard~ echo What do you want to do? echo USB Storage Devices. echo 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 Answers
You are getting that error because when the param1 if statements are evaluated, param is always null due to being scoped variables without delayed expansion.
When parentheses are used, all the commands and variables within those parentheses are expanded. And at that time, param1 has no value making the if statements invalid. When using delayed expansion, the variables are only expanded when the command is actually called.
Also I recommend using if not defined command to determine if a variable is set.
@echo off setlocal EnableExtensions EnableDelayedExpansion cls title ~USB Wizard~ echo What do you want to do? echo USB Storage Devices. echo 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 1Oh, dear. A few little problems...
As pointed out by others, you need to quote to protect against empty/space-containing entries, and use the !delayed_expansion! facility.
Two other matters of which you should be aware:
First, set/p will assign a user-input value to a variable. That's not news - but the gotcha is that pressing enter in response will leave the variable UNCHANGED - it will not ASSIGN a zero-length string to the variable (hence deleting the variable from the environment.) The safe method is:
set "var=" set /p var= That is, of course, if you don't WANT enter to repeat the existing value.
Another useful form is
set "var=default" set /p var= or
set "var=default" set /p "var=[%var%]" (which prompts with the default value; !var! if in a block statement with delayedexpansion)
Second issue is that on some Windows versions (although W7 appears to "fix" this issue) ANY label - including a :: comment (which is a broken-label) will terminate any 'block' - that is, parenthesised compound statement)
you need double quotes in all your three if statements, eg.:
IF "%a%"=="2" ( @echo OFF &SETLOCAL ENABLEDELAYEDEXPANSION cls title ~USB Wizard~ echo What do you want to do? echo USB Storage Devices. echo 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 2If you are getting this error on your IF statement check if used or not your double equals to compare your variable.
Eg.
IF [%checkresult%]=1 GOTO INVALID This throws "=1 was unexpected at this time."
To correct this add another equals sign.
IF [%checkresult%]==1 GOTO INVALID