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
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
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)
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