154

バッチ ファイルの if - else 構造について質問があります。各コマンドは個別に実行されますが、「if - else」ブロックを安全に使用できなかったため、プログラムのこれらの部分が機能しません。これらのパーツを実行するにはどうすればよいですか? ありがとうございました。

IF %F%==1 IF %C%==1 (
    ::copying the file c to d
    copy "%sourceFile%" "%destinationFile%"
    )
ELSE IF %F%==1 IF %C%==0 (
    ::moving the file c to d
    move "%sourceFile%" "%destinationFile%"
    )

ELSE IF %F%==0 IF %C%==1 (
    ::copying a directory c from d, /s:  boş olanlar hariç, /e:boş olanlar dahil
    xcopy "%sourceCopyDirectory%" "%destinationCopyDirectory%" /s/e
    )
ELSE IF %F%==0 IF %C%==0 (
    ::moving a directory
    xcopy /E "%sourceMoveDirectory%" "%destinationMoveDirectory%"
    rd /s /q "%sourceMoveDirectory%"
    )
4

8 に答える 8

124

構文が正しくありません。使用できませんELSE IF。とにかく本当に必要ではないようです。複数のIFステートメントを使用するだけです。

IF %F%==1 IF %C%==1 (
    ::copying the file c to d
    copy "%sourceFile%" "%destinationFile%"
    )

IF %F%==1 IF %C%==0 (
    ::moving the file c to d
    move "%sourceFile%" "%destinationFile%"
    )

IF %F%==0 IF %C%==1 (
    ::copying a directory c from d, /s:  boş olanlar hariç, /e:boş olanlar dahil
    xcopy "%sourceCopyDirectory%" "%destinationCopyDirectory%" /s/e
    )

IF %F%==0 IF %C%==0 (
    ::moving a directory
    xcopy /E "%sourceMoveDirectory%" "%destinationMoveDirectory%"
    rd /s /q "%sourceMoveDirectory%"
    )

優れたバッチ ファイル リファレンス: http://ss64.com/nt/if.html

于 2012-06-18T11:29:10.977 に答える
60

質問といくつかの回答では、DOS でのこの擬似コードの意味について少し混乱していると思います: IF A IF BX ELSE Y. これは IF(A and B) THEN X ELSE Y を意味するものではありませんが、実際は IF A( IF B THEN X ELSE Y) を意味します。A のテストが失敗した場合、内部の if-else 全体が無視されます。

前述の回答の 1 つとして、この場合、テストの 1 つだけが成功するため、「else」は必要ありませんが、もちろん、この例でのみ機能します。if-else を実行するための一般的な解決策ではありません。

これを回避する方法はたくさんあります。ここにいくつかのアイデアがあります。どれもかなり醜いですが、ちょっと、これは DOS です (または少なくとも DOS でした)。

@echo off

set one=1
set two=2

REM Example 1

IF %one%_%two%==1_1 (
   echo Example 1 fails
) ELSE IF %one%_%two%==1_2 (
   echo Example 1 works correctly
) ELSE (
    echo Example 1 fails
)

REM Example 2

set test1result=0
set test2result=0

if %one%==1 if %two%==1 set test1result=1
if %one%==1 if %two%==2 set test2result=1

IF %test1result%==1 (
   echo Example 2 fails
) ELSE IF %test2result%==1 (
   echo Example 2 works correctly
) ELSE (
    echo Example 2 fails
)

REM Example 3

if %one%==1 if %two%==1 (
   echo Example 3 fails
   goto :endoftests
)
if %one%==1 if %two%==2 (
   echo Example 3 works correctly
   goto :endoftests
)
echo Example 3 fails
)
:endoftests
于 2013-04-26T20:47:31.020 に答える
13

if else私の知る限り、他の言語のようにバッチで実行することはできません。ネストされている必要がありますif

ネストされたifバッチを使用すると、次のようになります

IF %F%==1 IF %C%==1(
    ::copying the file c to d
    copy "%sourceFile%" "%destinationFile%"
    ) ELSE (
        IF %F%==1 IF %C%==0(
        ::moving the file c to d
        move "%sourceFile%" "%destinationFile%"
        ) ELSE (
            IF %F%==0 IF %C%==1(
            ::copying a directory c from d, /s:  boş olanlar hariç, /e:boş olanlar dahil
            xcopy "%sourceCopyDirectory%" "%destinationCopyDirectory%" /s/e
            ) ELSE (
                IF %F%==0 IF %C%==0(
                ::moving a directory
                xcopy /E "%sourceMoveDirectory%" "%destinationMoveDirectory%"
                rd /s /q "%sourceMoveDirectory%"
                )
            )
        )
    )

またはジェームズが提案したように、あなたifのを連鎖させますが、適切な構文は次のとおりだと思います

IF %F%==1 IF %C%==1(
    ::copying the file c to d
    copy "%sourceFile%" "%destinationFile%"
    )
于 2012-06-18T11:29:56.990 に答える
1

if-then-else 構造を維持するために「done」パラメーターを追加したいので、少し遅れて複雑な if-condition にはおそらくまだ適しています。

set done=0
if %F%==1 if %C%==0 (set done=1 & echo found F=1 and C=0: %F% + %C%)
if %F%==2 if %C%==0 (set done=1 & echo found F=2 and C=0: %F% + %C%)
if %F%==3 if %C%==0 (set done=1 & echo found F=3 and C=0: %F% + %C%)
if %done%==0 (echo do something)
于 2016-10-02T11:21:52.537 に答える
0

IF...ELSE IF特に、各 IF 行で条件式を 1 つだけ使用する場合、構文はバッチ ファイルで非常にうまく機能します。

IF %F%==1 (
    ::copying the file c to d
    copy "%sourceFile%1" "%destinationFile1%"
) ELSE IF %F%==0 (
    ::moving the file e to f
    move "%sourceFile2%" "%destinationFile2%" )

あなたの例IF...AND...IFでは、2 つの条件を同時に満たす必要がある型構造を使用しています。この場合、引き続きIF...ELSE IF構文を使用できますが、次の ELSE 条件の不確実性を避けるために括弧を追加します。

IF %F%==1 (IF %C%==1 (
    ::copying the file c to d
    copy "%sourceFile1%" "%destinationFile1%" )
) ELSE IF %F%==1 (IF %C%==0 (
    ::moving the file e to f
    move "%sourceFile2%" "%destinationFile2%"))

上記の構成は、次と同等です。

IF %F%==1 (
    IF %C%==1 (
    ::copying the file c to d
    copy "%sourceFile1%" "%destinationFile1%"
    ) ELSE IF %C%==0 (
    ::moving the file e to f
    move "%sourceFile2%" "%destinationFile2%"))

バッチ コマンドの処理順序は、CMD.exe の解析順序によって異なります。構造がその論理的な順序に従っていることを確認してください。原則として、それは機能します。バッチ スクリプトがエラーなしで Cmd.exe によって処理された場合、これは正しい (つまり、OS の Cmd.exe バージョンでサポートされている) 構成であることを意味します。

于 2016-08-08T02:36:33.587 に答える