it-swarm.com.de

Batch-Datei: (war zu diesem Zeitpunkt unerwartet

Ich erhalte diesen Fehler:

war zu diesem Zeitpunkt unerwartet

Der Fehler tritt auf, nachdem der Wert von a akzeptiert wurde. Ich habe versucht, auf Nullwerte zu prüfen, die ein solches Problem verursachen könnten, war jedoch erfolglos.

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
12
user2540289

Sie erhalten diesen Fehler, weil, wenn die param1 Wenn Anweisungen ausgewertet werden, ist param immer null, da es sich um Bereichsvariablen ohne verzögerte Erweiterung handelt.

Wenn Klammern verwendet werden, werden alle Befehle und Variablen in diesen Klammern erweitert. Und zu diesem Zeitpunkt hat param1 keinen Wert, der die if-Anweisungen ungültig macht. Bei Verwendung der verzögerten Erweiterung werden die Variablen nur dann erweitert, wenn der Befehl tatsächlich aufgerufen wird.

Ich empfehle auch die Verwendung von if not defined Befehl, um festzustellen, ob eine Variable gesetzt ist.

@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
25
David Ruhmann

Ach je. Ein paar kleine Probleme ...

Wie bereits von anderen erwähnt, müssen Sie zum Schutz vor leeren/Leerzeichen enthaltenden Einträgen ein Anführungszeichen setzen und! Delayed_expansion! Einrichtung.

Zwei weitere Dinge, die Sie beachten sollten:

Zuerst, set/p weist einer Variablen einen Benutzereingabewert zu. Das ist keine Neuigkeit - aber der Haken ist, dass das Drücken von enter als Antwort die Variable UNGEÄNDERT lässt - es wird der Variablen keine Zeichenfolge mit der Länge Null zugewiesen (daher wird die Variable aus der Umgebung gelöscht.) Die sichere Methode ist :

 set "var="
 set /p var=

Dies ist natürlich der Fall, wenn Sie nicht möchten, dass enter den vorhandenen Wert wiederholt.
Eine andere nützliche Form ist

 set "var=default"
 set /p var=

oder

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

(die mit dem Standardwert auffordert; !var! wenn in einer Blockanweisung mit verzögerter Erweiterung)

Das zweite Problem ist, dass bei einigen Windows-Versionen (obwohl W7 dieses Problem anscheinend "behebt") JEDE Bezeichnung - einschließlich eines :: comment (bei dem es sich um eine fehlerhafte Bezeichnung handelt) beendet jeden 'Block' (dh eine in Klammern gesetzte zusammengesetzte Anweisung)

9
Magoo

sie benötigen doppelte Anführungszeichen in allen Ihren drei if Anweisungen, zB:

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
4
Endoro