21

このエラーが発生しています:

(この時は予想外だった

の値を受け入れた後にエラーが発生しますa。このような問題を引き起こす可能性のある null 値を試してみましたが、失敗しました。

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
4

4 に答える 4

13

まあ。いくつかの小さな問題...

他の人が指摘したように、空/スペースを含むエントリから保護するために引用する必要があり、!delayed_expansion! 施設。

あなたが知っておくべき他の2つの事項:

まず、set/pユーザー入力値を変数に割り当てます。それはニュースではありません - しかし、落とし穴は、それに応答して押すenterと、変数が UNCHANGED のままになるということです - 長さゼロの文字列を変数に割り当てません (したがって、環境から変数を削除します)。安全な方法は次のとおりです。

 set "var="
 set /p var=

enterもちろん、既存の値を繰り返したくない場合です。
別の便利な形式は

 set "var=default"
 set /p var=

また

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

(これはデフォルト値でプロンプトを表示します!var!。delayedexpansion を使用するブロック ステートメント内の場合)

2番目の問題は、一部のWindowsバージョンでは(W7はこの問題を「修正」しているように見えますが)、:: comment(壊れたラベルである)任意のラベルを含むと、「ブロック」、つまり括弧で囲まれた複合ステートメントが終了することです)

于 2013-07-02T01:05:32.513 に答える
11

if3 つのステートメントすべてに二重引用符が必要です。例:

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
于 2013-07-01T20:19:35.927 に答える