2013-07-01 8 views
9

sto ottenendo questo errore:.Batch File: (è stato inaspettato in questo momento

(was unexpected at this time

l'errore si verifica dopo aver accettato il valore di una ho provato e controllato per valori nulli che potrebbero causare tale problema ,, ma senza successo.

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

Se si attiva l'eco (prima riga), viene visualizzato qualcosa di utile? –

risposta

20

hai trovato questo errore perché quando il param1 se le dichiarazioni vengono valutate, param è sempre nullo a causa di essere ambito variabili senza espansione ritardata.

Quando si utilizzano le parentesi, tutti i comandi e le variabili all'interno di quelle parentesi vengono espanse. E in quel momento, param1 non ha valore rendendo le istruzioni if ​​invalide. Quando si utilizza l'espansione ritardata, le variabili vengono espanse solo quando viene effettivamente chiamato il comando.

Inoltre, si consiglia di utilizzare il comando if not defined per determinare se è impostata una variabile.

@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

+1, espansione ritardata, OMG :) – Endoro

+0

Bellissima! Grazie!! =) – user2540289

4

è necessario virgolette doppie in tutte le tre if dichiarazioni, ad es .:

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 
8

Oh, caro. Alcuni piccoli problemi ...

Come indicato da altri, è necessario citare per proteggere contro voci vuote/contenenti spazio, e utilizzare! Delayed_expansion! servizio, struttura. altri

due questioni di cui si dovrebbe essere consapevoli:

Prima, set/p assegnerà un valore di utente-input a una variabile. Questa non è una novità, ma il fatto che premendo enter in risposta lascerà la variabile UNCHANGED - non assegnerà una stringa di lunghezza zero alla variabile (quindi eliminando la variabile dall'ambiente.) Il metodo sicuro è:

set "var=" 
set /p var= 

Ovviamente, se non si desidera enter ripetere il valore esistente.
Un'altra forma utile è

set "var=default" 
set /p var= 

o

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

(che spinge con il valore di default; !var! se in un comunicato blocco con delayedexpansion)

seconda questione è che su alcune versioni di Windows (anche se W7 sembra "risolvere" questo problema) QUALSIASI etichetta - incluso uno :: comment (che è un'etichetta rotta) termina qualsiasi "blocco" - cioè, dichiarazione composta parentesi)

+0

+1 Ottimo punto sui commenti dell'etichetta di hacking. Ecco una discussione interessante sul comportamento del commento etichetta strano qui: http://www.dostips.com/forum/viewtopic.php?f = 3 & t = 4204 –

+0

@David Discussione interessante, ma rifiuterei l'idea che '::' sia un interruttore registrato su un'unità non riuscita. Se lo fosse, dovrebbe generare un errore al di fuori di un blocco. Considerando che l'argomento accademico può essere interessante, purtroppo le norme e i regolamenti riguardanti il ​​posizionamento delle etichette/:: - i commenti appaiono oltre all'attenzione del batcher medio o casuale di oggi e il potenziale di rottura durante la manutenzione rende l'uso "intelligente" troppo pericoloso per il mio gusto. Non sono sicuro se la situazione sia anche dipendente dalla versione. Seguirò una filosofia di no-labels/:: - comments-in-a-block per l'amor del cielo. – Magoo

+0

Sono d'accordo con te. I commenti sulle etichette Hack devono sempre essere evitati tra parentesi a causa del loro comportamento indefinito. La discussione era solo per coloro che volevano leggere di più sui comportamenti e perché è male utilizzarli. –