如何在批处理文件中使用 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%"
)
872818 次浏览

你的语法不正确。你不能用 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

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

或者像詹姆斯建议的那样,把你的 if链接起来,不过我认为正确的语法是

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

我认为在这个问题和一些答案中,对于 DOS 中这个伪代码的含义有一点混淆: IF A B X ELSE Y。它并不意味着如果(A 和 B)那么 XelseY,但实际上意味着如果 A (如果 B 那么 XelseY)。如果 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

我相信你可以用

if ___ (


do this


) else if ___ (


do this


)

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 处理而没有错误,这意味着这是正确的(即您的 OS Cmd.exe 版本支持)构造,即使有人说不是这样。

有点晚了,对于复杂的 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)

这是我的代码示例 if. . else. . if
它们执行以下操作

提示用户输入进程名

如果进程名称为 无效,则为
然后写入用户

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

如果进程名称为 服务
然后写入用户

Error : You can't kill the Processor above

如果进程名称是 有效而不是 服务
然后写入用户

通过 taskill杀死了 程序

所以我叫它 过程杀手,蝙蝠
我的准则是:

@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 )

以下是我如何处理如果别的情况

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

注意 它不同于 if-elseif 块,不同于 C + + 或 Java 等其他编程语言,但它可以完成您需要完成的任务