Bir toplu iş dosyasında if - else yapısı nasıl kullanılır?


136

Bir toplu iş dosyasında if - else yapısı hakkında bir sorum var. Her komut ayrı ayrı çalışır, ancak "if - else" bloklarını güvenle kullanamadım, bu yüzden programımın bu parçaları çalışmaz. Bu parçaları nasıl çalıştırabilirim? Teşekkür ederim.

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

Sorum net okunuyor mu? Bunu satır satır okudum ama bana yan yana geliyor.
isimsiz

4
Merhaba, Stack Overflow'a hoş geldiniz! Bir kod bloğu oluşturmak için ilgili metni vurgulayabilir ve {}düğmesine tıklayabilirsiniz; yayınların daha okunabilir olmasına yardımcı olur ve işaretleme ile ilgili bazı sorunları önler. Sorunuza cevap olarak, şimdi! Bir soru yazarken, bir kez gönderildikten sonra nasıl görüneceğini görebilmeniz için aşağıda bir önizleme vardır.
Ben

1
Açıklamanız için teşekkür ederim. Bu yöntemi kullanacağım.
isimsiz

Yanıtlar:


111

Sözdiziminiz yanlış. Kullanamazsın ELSE IF. Görünüşe göre gerçekten buna ihtiyacınız yok. Birden çok IFifadeyi kullanmanız yeterlidir :

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

Büyük toplu iş dosyası başvurusu: http://ss64.com/nt/if.html


2
Lütfen yanılıyorsam beni düzeltin, ancak &&birden fazla ifkoşulda kullanabileceğinizi düşünmüyorum , alternatif sözdizimime bakın?
Bali C

eğer if koşulum şöyle ise: "IF% F% == 0" güvenli bir şekilde çalışır ancak eklediğimde && çalışmaz. Bir if'de iki koşulu nasıl kullanabilirim?
isimsiz

1
@ aprogrammer, örneğime bak. Birden fazla koşulunuz varsa, kullanınIF condition1 IF condition 2
James Hill

Cevabınızı denemiştim ama çalıştıramadım ama tekrar denedim ve çalıştırdığım kodumu değiştirdim. Kodumun bir bölümünün son durumu şöyle: EĞER% F% == 1 EĞER% C% == 1 (:: c dosyasını d kopyasına kopyalamak "% sourceFile%" "% destinationFile%") ELSE (IF % F% == 1 EĞER% C% == 0 (:: c dosyasını d konumuna taşımak "% sourceFile%" "% destinationFile%") ELSE (EĞER% F% == 0 EĞER% C% == 1 (:: c dizinini d, / s: boş olanlar hariç, / e: boş olanlar dahil xcopy "% sourceCopyDirectory%" "% destinationCopyDirectory%" / s / e))
isimsiz

4
Ne kullanamazsın demek istiyorsun ELSE IF? Win7 altında iyi çalışıyor. Örneğe
bryc

56

Ben soruda ve bazı cevaplarda DOS bu sahte kodun anlamı hakkında biraz karışıklık olduğunu düşünüyorum: EĞER BX ELSE Y EĞER. EĞER EĞER (A ve B) SONRA X ELSE Y, ama gerçek EĞER A anlamına gelir (EĞER B EĞER Y EĞER Y). A testi başarısız olursa, iç if-else göz ardı edilir.

Bahsedilen cevaplardan biri olarak, bu durumda testlerden sadece biri başarılı olabilir, bu yüzden 'else' gerekli değildir, ancak elbette sadece bu örnekte çalışır, if-else yapmak için genel bir çözüm değildir.

Bunun etrafında birçok yol var. İşte birkaç fikir, hepsi oldukça çirkin ama hey, bu DOS (ya da en azından) oldu!

@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

İlk ikisinin setyüzde işaretine ihtiyacı olmadığını düşünüyorum ; olmalıset one=1
Geoff

13

AFAIK if else, diğer dillerde olduğu gibi toplu olarak yapamazsınız, iç içe geçirilmesi gerekir if.

Yuvalanmışları kullanarak iftoplu işiniz

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

ya da James'in önerdiği gibi, zincirinizi if, ancak uygun sözdiziminin

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

1
if else, özellikle C benzeri dillerde de yuvalanmış if. Bunları toplu iş dosyalarında bloklarla da iç içe yerleştirmeniz gerekmez.
Joey

@Joey Tam olarak takip etmiyorum. else ifCombo sadece iç içe olduğunu biliyorum ifama bu anahtar kelimeleri C dillerinde olduğu gibi toplu olarak birlikte kullanabileceğinizi düşünmüyordum.
Bali C

Hmm Hala çalışamıyorum, ama sözünü alacağım, neden bahsettiğini biliyorsun, bu cevabı uzun bir versiyon olarak bırakacağım :)
Bali C

Yanıtlarınız için teşekkür ederim, ancak hiçbiri kodumda çalışmadı.
isimsiz

başka bir örnek: eğer 1 == 1 (yankı 1) başka (1 == 1 (yankı 2) başka (yankı 3) ise)
JohnP2

1

Gibi bir şey kullanabileceğine inanıyorum

if ___ (

do this

) else if ___ (

do this

)

27
İkinci şarttaki ifade "bunu" yapmamalı mı?
bvj

7
@bvj Hayır, hayır, her şeyi yanlış anladınız. Olmalı do foove do bar.
yyny

Eğer yazarken IF (test) (command) ELSE IF (test) (command), sen ima ediyorsun IF (test) (command) ELSE (IF (test) (command)). Bu bazen işe yarayabilir, ancak DOS'ta kabul edilebilir gerçek bir programlama yapısı olduğuna inanıyorsanız, başarısız olduğunda sorun gidermek için bir PITA olacaktır.
Tim

1

Biraz geç ve belki de hala karmaşık if-koşullar için iyi, çünkü bir if-then-else yapısını korumak için bir "done" parametresi eklemek istiyorum:

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 yapılar toplu iş dosyalarında, özellikle de her IF satırında yalnızca bir koşullu ifade kullandığınızda çok iyi çalışır:

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Örneğinizde, aynı anda 2 koşulun karşılanması gereken tür yapısını kullanıyorsunuz . Bu durumda IF...ELSE IF, bir sonraki ELSE koşulu için belirsizliği önlemek için yapıyı kullanabilirsiniz , ancak ekstra parantezle:

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

Yukarıdaki yapı şuna eşdeğerdir:

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

Toplu iş komutlarının işlenmesi CMD.exe ayrıştırma sırasına bağlıdır . Yapınızın bu mantıksal sıraya uyduğundan emin olun ve kural olarak çalışacaktır. Toplu komut dosyanız, Cmd.exe tarafından hatasız olarak işleniyorsa, birisi aksini söylemiş olsa bile, bu doğru (yani OS Cmd.exe sürümünüz tarafından desteklenir) yapıdır.


0

İşte benim kod Örnek if..else..if
hangi aşağıdakileri yapmak

İşlem Adı için kullanıcı sor

İşlem adı geçersizse
, kullanıcıya yazılır

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

işlem adı hizmetler ise,
o zaman kullanıcıya yazma

Error : You can't kill the Processor above 

işlem adı geçerliyse hizmetler değil
kullanıcıya yazılır

süreç yoluyla öldürüldütaskill

Bu yüzden Process killer.bat olarak adlandırdım
İşte Kodum :

@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

durum başka olursa nasıl hallettim

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

C ++ veya Java gibi diğer programlama dilleriyle if-elseif bloğu ile aynı olmadığını unutmayın , ancak yapmanız gerekeni yapacak

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.