W pliku wsadowym DOS możemy mieć tylko 1 linię, jeśli treść instrukcji? Myślę, że znalazłem miejsce, którego mógłbym użyć ()
dla bloku if, takiego jak {}
używany w językach programowania podobnych do C, ale nie wykonuje instrukcji, gdy próbuję tego. Brak komunikatu o błędzie. To mój kod:
if %GPMANAGER_FOUND%==true(echo GP Manager is up
goto Continue7
)
echo GP Manager is down
:Continue7
O dziwo, po uruchomieniu pliku wsadowego nie jest drukowany komunikat „GP Manager nie działa” ani „GP Manager nie działa”.
if-statement
batch-file
Hugh Darling
źródło
źródło
Odpowiedzi:
Rzeczywiście, możesz umieścić utworzyć blok instrukcji do wykonania po warunku. Ale masz niewłaściwą składnię. Nawiasy należy stosować dokładnie tak, jak pokazano:
Nie wierzę jednak, że istnieje jakaś wbudowana składnia
else-if
instrukcji. Będziesz niestety musiał utworzyć zagnieżdżone blokiif
instrukcji, aby sobie z tym poradzić.Po drugie, ten
%GPMANAGER_FOUND% == true
test wydaje mi się bardzo podejrzany. Nie wiem, na co jest ustawiona zmienna środowiskowa ani jak ją ustawiasz, ale bardzo wątpię, czy kod, który pokazałeś, da wynik, którego szukasz.Poniższy przykładowy kod działa dobrze dla mnie:
Zwróć uwagę na kilka szczegółowych informacji na temat mojego przykładowego kodu:
@echo off
aby nie widzieć wszystkich instrukcji wyświetlanych na konsoli podczas ich wykonywania, a zamiast tego wyświetlać tylko wyniki tych, które konkretnie zaczynają się odecho
.ERRORLEVEL
zmiennej tylko jako testu. Przeczytaj więcej tutajźródło
ERRORLEVEL
nie jest odpowiedzią na jego problem. Po prostu zamieszczałem przykład właściwej składni. Każda forma jest w tym przypadku akceptowalna, tak samo jak byłabyif 0 == 0
lub każde inne trywialne wyrażenie. Ale rzeczywiście, upewnij się, że rozumiesz różnicę między zmienną środowiskową%ERRORLEVEL%
a wewnętrznąERRORLEVEL
częścią procesora poleceń. Raymond Chen ładnie wyjaśnia to na tym blogu .REM This is a comment (or so I thought)
się wIF
blok spowoduje zepsucie.IF %somevar%==example_string2
, zawsze powinien to być kod, więc operand rozwiązuje się tak,IF "value_of_somevar"=="example_string2
aby uniknąć znaków specjalnych w którymkolwiek z argumentów łańcuchowych powodujących błędy składniowe wIF
instrukcji. Ustawiane wartości powinny być zawsze wykonywane, ponieważset "somevar=value_of_somevar"
Składnia ta pozwala na uniknięcie znaków specjalnych w wartościach zmiennych, Uwaga że nie mam na myśliset somevar="value_of_somevar"
Logicznie rzecz biorąc, odpowiedź Cody'ego powinna działać. Jednak nie sądzę, aby wiersz polecenia logicznie obsługiwał blok kodu. Przez całe życie nie mogę sprawić, żeby to działało poprawnie z więcej niż jednym poleceniem w bloku. W moim przypadku obszerne testy wykazały, że wszystkie polecenia w bloku są buforowane i wykonywane jednocześnie na końcu bloku. To oczywiście nie daje oczekiwanych rezultatów. Oto nadmiernie uproszczony przykład:
To powinno zapewnić VAR3 z następujących wartości:
ale zamiast tego daje:
ponieważ wszystkie 3 polecenia są buforowane i wykonywane jednocześnie po wyjściu z bloku kodu.
Udało mi się rozwiązać ten problem, ponownie pisząc blok if, aby wykonać tylko jedno polecenie - goto - i dodając kilka etykiet. Jest niezgrabny i nie bardzo mi się to podoba, ale przynajmniej działa.
źródło
set var3=!var1!_!var2!
Zamiast tego „goto bałagan” spróbuj użyć znaku ampersand & lub podwójnego znaku ampersand && (warunek poziomu błędu 0) jako separatorów poleceń.
Naprawiłem fragment skryptu za pomocą tej sztuczki, podsumowując, mam trzy pliki wsadowe, jeden, który wywołuje pozostałe dwa po znalezieniu liter, które zostały przypisane do zewnętrznych dysków kopii zapasowych. Zostawiam pierwszy plik na głównym dysku zewnętrznym, więc wywołania jego procedury tworzenia kopii zapasowych działały dobrze, ale wywołania drugiego wymagały zmiany aktywnego dysku. Poniższy kod pokazuje, jak to naprawiłem:
źródło
Natknąłem się na ten artykuł w wynikach zwróconych przez wyszukiwanie związane z poleceniem IF w pliku wsadowym i nie mogłem oprzeć się możliwości poprawienia błędnego przekonania, że bloki IF są ograniczone do pojedynczych poleceń. Poniżej znajduje się część produkcyjnego skryptu poleceń systemu Windows NT, który jest uruchamiany codziennie na komputerze, na którym tworzę tę odpowiedź.
Być może bloki dwóch lub więcej wierszy dotyczą wyłącznie skryptów poleceń systemu Windows NT (plików .CMD), ponieważ przeszukanie katalogu skryptów produkcyjnych aplikacji, które jest ograniczone do plików wsadowych starej szkoły (.BAT), ujawniło tylko bloki jednego polecenia . Ponieważ aplikacja przeszła w rozszerzoną konserwację (co oznacza, że nie jestem aktywnie zaangażowana we wspieranie jej), nie mogę powiedzieć, czy to dlatego, że nie potrzebowałem więcej niż jednej linii, czy też nie mogłem sprawić, by działały.
Niezależnie od tego, jeśli to ostatnie jest prawdą, istnieje proste obejście; przenieść wiele wierszy albo do oddzielnego pliku wsadowego, albo do podprocedury pliku wsadowego. Wiem, że ta ostatnia działa w obu rodzajach skryptów.
źródło
Może trochę późno, ale mam nadzieję, że to piekło:
źródło