web-dev-qa-db-ja.com

バッチファイル内でif - else構造を使用する方法

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

あなたの文法は正しくありません。 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

99
James Hill

私はこの質問といくつかの答えで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
52
gtpunch

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

またはJamesが示唆しているように、あなたのifを連鎖させる、しかし私は正しい構文が

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

If-then-else構造を維持するために "done"パラメータを追加したいので、少し遅くても、おそらく複雑なif-conditionsにはまだ良いでしょう。

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

こんなことができると思います

if ___ (

do this

) else if ___ (

do this

)
1
user4090570

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

あなたの例では、2つの条件が同時に満たされなければならないIF...AND...IF 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
sambul35

これが私のコードですif..else..ifの例
次のことを行う

ユーザーにプロセス名の入力を求める

プロセス名が invalid の場合
それはユーザーに書き込みます

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

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

Error : You can't kill the Processor above 

プロセス名が valid で、 services ではない場合
それはユーザーに書き込みます

の プロセス 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
Omar