1

これに関するほとんどのトピックを既に読んでおり、Windows コマンド ラインでは複雑な if/then ブロックが苦痛であることを理解しています。エラー。

%confirm% が設定されている場所に関係しているように感じますが、よくわかりません。もともと私はブロックに goto を持っていましたが、それは禁止されていると読んだので、ネストされた if/if/else でそれを回避しようとしました。サイコロはありません。

コマンド シェルの内部の仕組みは私の理解を超えているため、私が行っていることよりも基本的なことは考えられません。

最初のバージョン:

@echo off

TITLE cleanup

:: make user confirm they want to cleanup old epub conversion files
set /p confirm = "Are you sure? (y/n): "

if %confirm% == y (
    rm ePub
    rm IP
    rm OP
    md IP
    exit
) else (
    if %confirm% == n (
        exit
    ) else (
        set /p confirm = "Are you sure? (y/n): "
    )
)   

現在の縮小版:

 @echo off

TITLE cleanup

:: make user confirm they want to cleanup old epub conversion files
set /p confirm = "Are you sure? (y/n): "

if %confirm% == y (
    rm ePub
    rm IP
    rm OP
    md IP
    exit
) else ( 
    exit
)
4

2 に答える 2

5

変数が実際に空の場合、コードの構文が壊れています。試す

if "%confirm%" == "y" (

の左側に常に何かがあることを保証し==ます。

于 2013-01-11T18:21:52.723 に答える
1

1- バッチ ファイルでは、SET var=valueSET /P var=promptコマンドの両方が変数名として、等号の前に配置された完全な文字列 (スペースを含む) を取ります。これは、このコマンドで次のことを意味します。

set /p confirm = "Are you sure? (y/n): "

...変数名は「確認+スペース」です。set /p の後に次の行を配置すると、この点を確認できます。

echo Value of "confirm": %confirm%  Value of "confirm ": %confirm %

結論: SET コマンドの等号の前にスペースを入れないでください

2- 同様に、変数に割り当てられるか、プロンプトとして使用される値は、引用符を含む等号の後に配置された完全な文字列です。使用する値/プロンプトを区切る場合:変数名と値/プロンプトの両方を引用符で囲みます。例えば:

set /p "confirm=Are you sure? (y/n): "

これは、式に特殊なバッチ文字が含まれている可能性がある SET /A コマンドで特に当てはまりますSET /A "var=1<<16"。ところで、SET /A コマンドの特定のケースでは、変数名と等号の間のスペースは無視さSET /A var = 1 echo %var%れます%var %

3- 前の 2 つのポイントとは無関係に、変数値が空である可能性がある場合 (SET /P によって読み取られる変数のように)、値は IF コマンドで引用符で囲まれている必要があります (また、値と比較されます) Ben Voigt のように前述しました。これは、ユーザーが Enter キーを押すだけでは SET /P コマンドが変数を変更しないために発生するため、常に SET /P コマンドの前にデフォルト値で変数を初期化する必要があります。そうしないと、プログラムは前の実行または前のサイクルで入力された値を処理する可能性があります。

set confirm=n
set /p "confirm=Are you sure? (y/n): "
if /I "%confirm%" == "y" (

ユーザーはスペースだけを入力する可能性があるため、以前の IF では引き続き引用符が必要です。また、ユーザーは大文字で Y または N を入力できるため、/I スイッチを使用して大文字と小文字を区別します。

それが役立つことを願っています...

アントニオ

于 2013-01-13T01:56:35.557 に答える