Mam pytanie o strukturę if - else w pliku wsadowym. Każde polecenie działa osobno, ale nie mogłem bezpiecznie używać bloków „if - else”, więc te części mojego programu nie działają. Jak mogę sprawić, by te części działały? Dziękuję Ci.
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%"
)
batch-file
if-statement
tytułowy
źródło
źródło
{}
przycisk; pomaga uczynić posty bardziej czytelnymi i pozwala uniknąć pewnych problemów ze znacznikami. Odpowiadając na twoje pytanie, teraz! Podczas pisania pytania poniżej znajduje się podgląd, dzięki czemu możesz zobaczyć, jak będzie wyglądać po opublikowaniu.Odpowiedzi:
Twoja składnia jest nieprawidłowa. Nie możesz użyć
ELSE IF
. Wygląda na to, że i tak go nie potrzebujesz. Po prostu użyj wieluIF
instrukcji:Świetne odniesienie do pliku wsadowego: http://ss64.com/nt/if.html
źródło
&&
w wieluif
warunkach, zobacz moją alternatywną składnię?IF condition1 IF condition 2
ELSE IF
? Działa dobrze pod Win7. Zobacz przykład: paste2.org/G8tMae92Myślę, że w pytaniu i niektórych odpowiedziach jest trochę zamieszania co do znaczenia tego pseudokodu w DOS: JEŚLI A IF BX INNY Y. Nie oznacza to JEŻELI (A i B) WTEDY X INNY Y, ale w Fakt oznacza JEŻELI A (JEŻELI B TO X INNY Y). Jeśli test A się nie powiedzie, to całe wewnętrzne if-else zostanie zignorowane.
Jak wspomniano w jednej z odpowiedzi, w tym przypadku tylko jeden z testów może zakończyć się sukcesem, więc „else” nie jest potrzebne, ale oczywiście działa to tylko w tym przykładzie, nie jest to ogólne rozwiązanie do robienia if-else.
Można to obejść na wiele sposobów. Oto kilka pomysłów, wszystkie są dość brzydkie, ale hej, to jest (a przynajmniej był) DOS!
źródło
set
nie potrzebują znaków procentu; powinno byćset one=1
AFAIK, nie możesz zrobić
if else
wsadowego, tak jak w innych językach, musi być zagnieżdżonyif
.Używając zagnieżdżonych plików
if
, twoja partia będzie wyglądaćlub jak zasugerował James, połącz swoje łańcuchy
if
, jednak myślę, że właściwa składnia jest takaźródło
if else
, zwłaszcza w językach typu C jest po prostu zagnieżdżonyif
. Nie musisz też zagnieżdżać ich blokami w plikach wsadowych.else if
kombinacja jest po prostu zagnieżdżona,if
ale nie sądziłem, że można użyć tych słów kluczowych razem w grupie, tak jak w językach C.Uważam, że możesz użyć czegoś takiego jak
źródło
do foo
ido bar
.IF (test) (command) ELSE IF (test) (command)
, sugerujeszIF (test) (command) ELSE (IF (test) (command))
. Może to czasami działać, ale jeśli uważasz, że jest to rzeczywista struktura programistyczna akceptowalna w DOS, będzie to PITA do rozwiązywania problemów, gdy się nie powiedzie.Trochę późno i być może nadal dobre dla złożonych warunków if, ponieważ chciałbym dodać parametr „done”, aby zachować strukturę if-then-else:
źródło
IF...ELSE IF
konstrukcje działają bardzo dobrze w plikach wsadowych, zwłaszcza gdy używasz tylko jednego wyrażenia warunkowego w każdym wierszu IF:W naszym przykładzie używasz
IF...AND...IF
konstrukcji typu, w której 2 warunki muszą być spełnione jednocześnie. W tym przypadku możesz nadal używaćIF...ELSE IF
konstrukcji, ale z dodatkowymi nawiasami, aby uniknąć niepewności co do następnego warunku ELSE:Powyższa konstrukcja jest równoważna z:
Sekwencja przetwarzania poleceń wsadowych zależy od kolejności analizowania programu CMD.exe . Po prostu upewnij się, że twoja konstrukcja zachowuje logiczną kolejność iz reguły będzie działać. Jeśli twój skrypt wsadowy jest przetwarzany przez Cmd.exe bez błędów, oznacza to, że jest to poprawna (tj. Obsługiwana przez wersję systemu operacyjnego Cmd.exe) konstrukcja, nawet jeśli ktoś powiedział inaczej.
źródło
Oto mój kod Przykład dla if..else..if
które wykonują następujące czynności
Pytaj użytkownika o nazwę procesu
Jeśli nazwa procesu jest nieprawidłowa,
to jest zapisywana do użytkownika
jeśli nazwa procesu to services
Następnie jest zapisywana do użytkownika
jeśli nazwa procesu jest prawidłowa, a nie usługi
to zapisuje się użytkownikowi
proces został zabity przez
taskill
więc nazwałem go Process killer.bat
Oto mój kod:
źródło
oto jak sobie poradziłem, jeśli inaczej, jeśli sytuacja
Zauważ, że nie jest to to samo, co blok if-elseif, jak inne języki programowania, takie jak C ++ lub Java, ale zrobi to, co musisz zrobić
źródło