我对批处理文件中的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%"
)
答案 0 :(得分:99)
您的语法不正确。您无法使用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
答案 1 :(得分:52)
我认为在这个问题和一些答案中有一些关于DOS中这种伪代码含义的混淆:IF A IF BX ELSE Y.它并不意味着IF(A和B)那么X ELSE Y ,但实际上意味着IF A(如果B那么X Y Y)。如果A的测试失败,那么整个内部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 :(得分: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%"
)
)
)
)
或者詹姆斯建议,链接你的if
,但我认为正确的语法是
IF %F%==1 IF %C%==1(
::copying the file c to d
copy "%sourceFile%" "%destinationFile%"
)
答案 3 :(得分:1)
我相信你可以使用像
这样的东西if ___ (
do this
) else if ___ (
do this
)
答案 4 :(得分:1)
有点晚了,对于复杂的if条件可能仍然有用,因为我想添加一个"完成"保持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)
答案 5 :(得分: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
类型构造,其中必须同时满足2个条件。在这种情况下,您仍然可以使用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 parsing order。只需确保您的构造遵循该逻辑顺序,并且通常它将起作用。如果您的批处理脚本由Cmd.exe处理而没有错误,则表示这是正确的(即您的OS Cmd.exe版本支持)构造,即使有人另有说法。
答案 6 :(得分:0)
这是我的代码示例if..else..if
执行以下操作
提示用户输入流程名称
如果流程名称无效
然后它写给用户
Error : The Processor above doesn't seem to be exist
如果流程名称为服务
然后它写给用户
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 )
答案 7 :(得分:0)
这是我在其他情况下的处理方式
if %env%==dev (
echo "dev env selected selected"
) else (
if %env%==prod (
echo "prod env selected"
)
)
注意,它与if-elseif块与其他编程语言(例如C ++或Java)不同,但是它将完成您需要做的事情