Как использовать структуру 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%"
)
7 ответов
ваш синтаксис неправильный. Вы не можете использовать 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
Я думаю, в вопрос и в ответы есть немного путаницы о значении этого псевдокода в DOS: в случае если б х еще Я. Это не значит, если(A и B), то X то y, но на самом деле означает, что если a( если B, то Х-то еще Г). Если тест А провалится, то он все внутреннее если-остальное будет проигнорировано.
как один из упомянутых ответов, в этом случае только один из тестов может преуспеть, поэтому "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
AFAIK вы не можете сделать if else
в пакете, как и на других языках, он должен быть вложенным if
s.
использование вложенных 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%"
)
немного поздно и, возможно, все еще хорошо для сложных условий 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
конструкции очень хорошо работают в пакетных файлах, в частности, когда вы используете только одно условное выражение для каждой строки 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
построить, но с дополнительными скобками, чтобы избежать неопределенности для следующего условия:
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-версия) построить, даже если кто-то говорит иначе.
вот мой пример кода для if..еще..если
которые делают следующее
запрос пользователя для имени процесса
если имя процесса недействительным
Тогда это написать пользователю
Error : The Processor above doesn't seem to be exist
если имя процесса услуги
Тогда это написать пользователю
Error : You can't kill the Processor above
если имя процесса действительный, а не услуги
Затем он пишет пользователю
на процесс был убит через taskill
так я его назвал убийца процесса.летучая мышь!--11-->
Вот мой код:
@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 )