if-else構造のバッチファイルの使用方法


136

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
こんにちは、Stack Overflowへようこそ!コードブロックを作成するには、関連するテキストを強調表示して{}ボタンをクリックします。投稿を読みやすくし、マークアップに関する問題を回避するのに役立ちます。あなたの質問に答えて、それは今です!質問を書くときは、下にプレビューがあるので、投稿後の様子を確認できます。
ベン

1
ご説明ありがとうございます。これらの方法を使用します。
町の名を冠した

回答:


110

構文が正しくありません。使用できません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


2
私が間違っている場合は修正してください。&&複数のif条件で使用できないと思います。別の構文を参照してください。
バリC

私のif条件が次のような場合: "IF%F%== 0"は安全に実行されますが、&&を追加すると実行されません。ifで2つの条件を使用するにはどうすればよいですか?
町の名を冠し

1
@aprogrammer、私の例を見てください。複数の条件がある場合は、次を使用しますIF condition1 IF condition 2
James Hill

私はあなたの答えを試しましたが、それを実行することはできませんでしたが、もう一度試し、実行するコードに変更しました。コードの一部の最後の状況は次のとおりです:IF%F%== 1 IF%C%== 1(::ファイルcをdにコピー "%sourceFile%" "%destinationFile%")ELSE(IF %F%== 1 IF%C%== 0(::ファイルcをdに移動 "%sourceFile%" "%destinationFile%"))ELSE(IF%F%== 0 IF%C%== 1(:: DからディレクトリCをコピーし、/ S:BOS olanlarhariç、/ E:BOS olanlar dahil XCOPY "%sourceCopyDirectory%" "%のdestinationCopyDirectoryの%" / S / E))
同名

4
使えないとはどういう意味ELSE IFですか?Win7では問題なく動作します。例を参照してください:paste2.org/G8tMae92
bryc

56

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

回答の1つとして、この場合は1つのテストのみが成功するため「else」は必要ありませんが、もちろんこの例でのみ機能するため、if-elseを実行するための一般的なソリューションではありません。

これを回避する方法はたくさんあります。ここにいくつかのアイデアがありますが、どれもかなり醜いですが、ちょっと、これは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

最初の2つsetはパーセント記号を必要としないと思います。あるべきset one=1
ジェフ・

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

1
if else、特にCのような言語では、入れ子にifもなっています。バッチファイルでブロックを使用してそれらをネストする必要もありません。
ジョーイ

@Joey私はあまりフォローしていません。私が知っているelse ifコンボだけで入れ子になっているifが、私はあなたがC言語でできるようにあなたがバッチで一緒にそれらのキーワードを使用することができるとは思いませんでした。
バリC

うーん、それでも機能しませんが、私はあなたの言葉を引き受けます。あなたが話していることを知っているので、私はこの回答を長いバージョンとして残します:)
Bali C

回答ありがとうございます。私のコードでは実行されなかったものはありません。
町の名を冠した

別の例:if 1 == 1(エコー1)else(if 1 == 1(エコー2)else(エコー3))
JohnP2

1

次のようなものを使用できると思います

if ___ (

do this

) else if ___ (

do this

)

27
2番目の条件のステートメントは "それを行う"であるべきではありませんか?
bvj 2014年

7
@bvjいいえ、いいえ、あなたはそれをすべて間違っています。である必要がdo fooありdo barます。
yyny

あなたが書くときIF (test) (command) ELSE IF (test) (command)、あなたはほのめかしていIF (test) (command) ELSE (IF (test) (command))ます。これは時々動作するかもしれませんが、それがDOSで受け入れられる実際のプログラミング構造であると確信している場合、失敗したときにトラブルシューティングを行うのはPITAになります。
ティム

1

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

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)

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つの条件を同時に満たす必要があるtype構文を使用します。この場合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バージョンでサポートされている)構成であることを意味します。


0

以下
は、if..else..ifのコード例です。

プロセス名をユーザーに要求する

プロセス名が無効な 場合は、
ユーザーに書き込みます

Error : The Processor above doesn't seem to be exist 

プロセス名がservicesの 場合、
ユーザーに書き込みます

Error : You can't kill the Processor above 

プロセス名が有効サービス ではない場合、
ユーザーに書き込みます

プロセスは経て殺害されましたtaskill

だから私はそれをプロセスkiller.bat と呼びましたこれが
私のコードです:

@echo off

:Start
Rem preparing the batch  
cls
Title Processor Killer
Color 0B
Echo Type Processor name to kill It (Without ".exe")
set /p ProcessorTokill=%=%  

:tasklist
tasklist|find /i "%ProcessorTokill%.exe">nul & if errorlevel 1 (
REM check if the process name is invalid 
Cls 
Title %ProcessorTokill% Not Found
Color 0A
echo %ProcessorTokill%
echo Error : The Processor above doesn't seem to be exist    

) else if %ProcessorTokill%==services (
REM check if the process name is services and doesn't kill it
Cls 
Color 0c
Title Permission denied 
echo "%ProcessorTokill%.exe"
echo Error : You can't kill the Processor above 

) else (
REM if the process name is valid and not services
Cls 
Title %ProcessorTokill% Found
Color 0e
echo %ProcessorTokill% Found
ping localhost -n 2 -w 1000>nul
echo Killing %ProcessorTokill% ...
taskkill /f /im %ProcessorTokill%.exe /t>nul
echo %ProcessorTokill% Killed...
)

pause>nul



REM If else if Template
REM if thing1 (
REM Command here 2 ! 
REM ) else if thing2 (
REM command here 2 !
REM ) else (
REM command here 3 !
REM )

0

ここに私が対処した方法があります。

if %env%==dev ( 
    echo "dev env selected selected"
) else (
    if %env%==prod (
        echo "prod env selected"
    )
)

それはC ++やJavaのような他のプログラミング言語としてのif-elseifをブロックと同じではありませんが、それはあなたが何をする必要があるかを行います

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.