Batch File: ( tidak terduga saat ini

Saya mendapatkan kesalahan ini:

( tidak terduga saat ini

Kesalahan terjadi setelah menerima nilai a. Saya mencoba dan memeriksa nilai null yang dapat menyebabkan masalah seperti itu,, tetapi tidak berhasil.

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
Larutan

Anda mendapatkan error tersebut karena ketika pernyataan param1 jika dievaluasi, param selalu null karena menjadi variabel cakupan tanpa perluasan tertunda.

Ketika tanda kurung digunakan, semua perintah dan variabel di dalam tanda kurung tersebut diperluas. Dan pada saat itu, param1 tidak memiliki nilai yang membuat pernyataan if tidak valid. Ketika menggunakan ekspansi tertunda, variabel-variabel hanya diperluas ketika perintah benar-benar dipanggil.

Saya juga merekomendasikan menggunakan perintah if not defined untuk menentukan apakah sebuah variabel sudah diset.

@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
Komentar (0)

Oh, sayang. Beberapa masalah kecil...

Seperti yang ditunjukkan oleh orang lain, anda perlu mengutip untuk melindungi entri yang kosong/berisi spasi, dan gunakan fasilitas !delayed_expansion!

Dua hal lain yang harus Anda ketahui:

Pertama, set/p akan memberikan nilai masukan pengguna ke sebuah variabel. Itu bukan berita baru - tetapi yang menjadi masalah adalah menekan enter sebagai respon akan membiarkan variabel TIDAK BERUBAH - tidak akan MENGASOSIASI string dengan panjang nol ke variabel (sehingga menghapus variabel dari lingkungan.) Metode yang aman adalah:

 set "var="
 set /p var=

Itu, tentu saja, jika Anda tidak ingin enter untuk mengulang nilai yang sudah ada.
Bentuk lain yang berguna adalah

 set "var=default"
 set /p var=

atau

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

(yang meminta dengan nilai default; !var! jika dalam pernyataan blok dengan delayedexpansion)

Masalah kedua adalah bahwa pada beberapa versi Windows (meskipun W7 tampaknya "memperbaiki &" masalah ini) label APAPUN - termasuk :: komentar (yang merupakan label rusak) akan mengakhiri 'blok' - yaitu, pernyataan majemuk bertanda kurung)

Komentar (4)

Anda perlu tanda kutip ganda di ketiga pernyataan jika Anda, misalnya .:

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
Komentar (0)