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


136

我对是否-批处理文件中的其他结构有疑问。每个命令都单独运行,但是我不能安全地使用“ 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%"
    )

我的问题读得清楚吗?我逐行阅读,但在我看来并排。
同名的2012年

4
嗨,欢迎来到堆栈溢出!为了创建一个代码块,您可以突出显示相关文本并单击{}按钮。它有助于使帖子更具可读性,并避免一些标记问题。为回答您的问题,现在开始!撰写问题时,下面有一个预览,因此您可以查看发布后的外观。
2012年

1
因此,谢谢您的解释。我将使用这些方法。
同名的2012年

Answers:


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情况下使用,请参阅我的替代语法?
2012年

如果我的if条件是这样的:“ IF%F%== 0”安全运行,但是当我添加&&时,它不会运行。如果在if中如何使用两个条件?
同名的2012年

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:boşolanlar dahil xcopy“%sourceCopyDirectory%”“%destinationCopyDirectory%” / s / e))
同义,

4
你是什​​么意思,你不能使用ELSE IF?在Win7下工作正常。参见示例:paste2.org/G8tMae92
bryc '16

56

我认为在问题中和某些答案中,关于DOS中此伪代码的含义有些困惑:IF A IF BX ELSEY。这并不意味着IF(A和B)然后是X ELSE Y,但在事实意味着IF A(IF B THEN X ELSE 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

我认为前两个set不需要百分号。应该是set one=1
Geoff

13

AFAIK不能if else像其他语言一样批量进行,它必须嵌套if

使用nested 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%"
    )

1
if else,尤其是在类似C的语言中也是if如此。您也不必将其与块嵌套在批处理文件中。
乔伊(Joey)2012年

@乔伊我不太明白。我知道else if组合只是一个嵌套,if但是我不认为您可以像使用C语言一样批量使用这些关键字。
2012年

嗯,我仍然无法使它正常工作,但是我会信服你的,你知道你在说什么,我将把这个答案留成一个长版:)
Bali C

感谢您的回答,但没有一个没有在我的代码中运行。
同名的2012年

另一个示例:如果1 == 1(回声1),否则(如果1 == 1(回声2),否则(回声3))
JohnP2,18年

1

我相信您可以使用诸如

if ___ (

do this

) else if ___ (

do this

)

27
第二个条件下的陈述不应该是“那样做”吗?
2014年

7
@bvj不,不,你弄错了。应该是do foodo bar
yyny

当你写的时候IF (test) (command) ELSE IF (test) (command),你在暗示IF (test) (command) ELSE (IF (test) (command))。有时这可能会起作用,但是如果您认为它是DOS可以接受的实际编程结构,那么它将在故障时成为PITA进行故障排除。
蒂姆(Tim)

1

有点晚了,也许对复杂的if条件仍然有用,因为我想添加一个“ done”参数来保持if-then-else结构:

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行仅使用一个条件表达式时:

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类型构造,其中必须同时满足两个条件。在这种情况下,您仍然可以使用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处理而没有错误,则表明这是正确的结构(即,操作系统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

所以我称它为Process 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"
    )
)

请注意,它与if-elseif块与其他编程语言(例如C ++或Java)不同,但是它将完成您需要做的事情

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.