如何在批处理文件中使用if - else结构?

sel*_*tas 129 if-statement batch-file

我有一个关于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%"
    )
Run Code Online (Sandbox Code Playgroud)

Jam*_*ill 105

你的语法不正确.你不能使用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%"
    )
Run Code Online (Sandbox Code Playgroud)

伟大的批处理文件参考:http://ss64.com/nt/if.html

  • 你是什​​么意思你不能使用`ELSE IF`?它在Win7下工作正常.参见示例:http://paste2.org/G8tMae92 (4认同)
  • @BaliC,你说的没错.太多C#今天:) (3认同)
  • 如果我错了,请纠正我,但我不认为你可以在多个`if`条件下使用`&&`,看看我的替代语法? (2认同)

小智 53

我认为在这个问题和一些答案中,有一些关于DOS中伪代码含义的混淆:IF A IF BX ELSE Y.它并不意味着IF(A和B)那么X是Y,但是事实意味着IF A(如果B那么X Y Y).如果A的测试失败,那么整个内部if-else将被忽略.

作为上面提到的答案之一,在这种情况下,只有一个测试可以成功,因此不需要'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
Run Code Online (Sandbox Code Playgroud)


Bal*_*i C 12

AFAIK你不能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%"
                )
            )
        )
    )
Run Code Online (Sandbox Code Playgroud)

或者正如詹姆斯建议的那样,链接你if的,但我认为正确的语法是

IF %F%==1 IF %C%==1(
    ::copying the file c to d
    copy "%sourceFile%" "%destinationFile%"
    )
Run Code Online (Sandbox Code Playgroud)


Ama*_*ino 7

这是我处理 if else if 情况的方法

if %env%==dev ( 
    echo "dev env selected selected"
) else (
    if %env%==prod (
        echo "prod env selected"
    )
)
Run Code Online (Sandbox Code Playgroud)

请注意,它与其他编程语言(如 C++ 或 Java)的 if-elseif 块不同,但它会执行您需要执行的操作