2013-07-01 26 views
9

otrzymuję ten błąd.Batch File (było nieoczekiwane w tej chwili

(was unexpected at this time

Błąd występuje po zaakceptowaniu wartość próbowałem i sprawdzane pod kątem wartości null, które mogłyby spowodować taki problem ,, ale była nieudana.

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

Po włączeniu echa (pierwszy wiersz) widzisz coś użytecznego? –

Odpowiedz

20

Otrzymujesz ten błąd, bo gdy param1 if są oceniane, param jest zawsze zerowa ze względu na zmienne są scoped bez opóźnionego ekspansji.

Po użyciu nawiasów wszystkie polecenia i zmienne w nawiasach są rozwijane. W tym czasie parametr 1 nie ma żadnej wartości, co sprawia, że ​​instrukcje if są nieprawidłowe. Podczas korzystania z opóźnionego rozwinięcia zmienne są rozszerzane tylko wtedy, gdy komenda jest rzeczywiście wywoływana.

Polecam również użycie polecenia if not defined w celu ustalenia, czy zmienna jest ustawiona.

@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, opóźniona ekspansja, OMG :) – Endoro

+0

Piękna! Dziękuję Ci!! =) – user2540289

4

trzeba cudzysłowów we wszystkich swoich trzech if wypowiedzi, np .:

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

O, kochanie. Kilka drobnych problemów ...

Jak zauważyli inni, należy zacytować, aby zabezpieczyć się przed wpisami zawierającymi puste/spacje i użyć opcji! Delayed_expansion! obiekt.

Dwie inne sprawy, których należy pamiętać:

pierwsze, set/p przypisze wartości wejściowe użytkownika do zmiennej. To nie nowina - ale najważniejsze jest to, że naciśnięcie enter w odpowiedzi pozostawi zmienną UNCHANGED - nie będzie ona PRZYWOŁAła łańcucha o zerowej długości do zmiennej (stąd usunięcie zmiennej ze środowiska). Bezpieczną metodą jest:

set "var=" 
set /p var= 

To jest, oczywiście, jeśli NIE CHCESZ enter, aby powtórzyć istniejącą wartość.
Inną użyteczną formą jest

set "var=default" 
set /p var= 

lub

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

(który prosi o wartości domyślnej; !var! jeśli w instrukcji blokowej z delayedexpansion)

Druga kwestia jest taka, że ​​w niektórych wersjach systemu Windows (chociaż wydaje się, że W7 "naprawia" ten problem) DOWOLNA etykieta - w tym :: comment (która jest uszkodzoną etykietą) spowoduje zakończenie dowolnego "bloku" - czyli parentessised złożonego oświadczenia)

+0

+1 Świetny punkt na temat komentarzy do etykiet hakerskich. Oto interesująca dyskusja na temat zachowania komentarzy o dziwnych etykietach tutaj: http://www.dostips.com/forum/viewtopic.php?f = 3 & t = 4204 –

+0

@David Ciekawa dyskusja, ale odrzuciłbym ideę, że '::' jest uszkodzonym przełącznikiem z logged-drive. Jeśli tak, to powinien wygładzić błąd poza blokiem. Podczas gdy argument akademicki może być interesujący, niestety zasady i przepisy dotyczące umieszczania etykiet/:: - komentarzy pojawiają się poza zasięgiem dzisiejszej średniej lub przypadkowej dawki, a możliwość złamania podczas konserwacji sprawia, że ​​"sprytne" użycie jest zbyt niebezpieczne dla mojego smak. Nie jestem pewien, czy sytuacja jest zależna od wersji. Będę trzymać się filozofii no-labels/:: - comments-in-a-block dla dobra zdrowia psychicznego. – Magoo

+0

Zgadzam się z tobą. W nawiasach należy zawsze unikać komentarzy do etykiet hackowych ze względu na ich niezdefiniowane zachowanie. Dyskusja była przeznaczona tylko dla tych, którzy chcieli przeczytać więcej na temat zachowań i dlaczego ich używać. –