Korzystam z następującej pętli w pliku wsadowym, aby indywidualnie wywoływać „funkcje” w pliku, zaczynając od wyświetlania tekstu, a kończąc sprawdzaniem i wyświetlaniem poziomu błędu.
Wywołanie funkcji pętli wykorzystuje 2 zmienne.
- nazwa funkcji podrzędnej, która ma zostać wywołana
- tekst do wyświetlenia na ekranie dla wygody użytkownika
Tak wyglądają te linie telefoniczne
call :loop BackupDatabase "Taking database backup"
call :loop StopBGService "Stopping the background service"
To jest sama funkcja pętli
:loop
:retry
echo %~2
call :%~1
IF %ERRORLEVEL% NEQ 0 (
SET ERRORLEV=%ERRORLEVEL%
ECHO Executing %~2 failed
ECHO Error Level: %ERRORLEV%
ECHO.
set /p ans=Do you want to retry %~2 [y/n]^>
if "%ans%"== "y" goto :retry
if "%ans%"== "Y" goto :retry
)
GOTO :EOF
Poniżej znajdziesz funkcje wywoływane przez każdą pętlę
:BackupDatabase
Perform database backup commands
GOTO :EOF
:StopBGService
Perform stop background service commands
GOTO :EOF
Problem, który mam, polega na tym, że gdy „pętla” nie działa poprawnie, skrypt powinien zapytać, czy wymagana jest ponowna próba. Za pierwszym razem, gdy tak się stanie, jeśli wpiszesz „n”, ponawia próbę? Czytałem w kółko skrypt pętli i nie mogę powiedzieć, dlaczego tak jest. Jeśli ktoś może to naprawić, byłaby to świetna pomoc lub ktoś mógłby wskazać lepszy sposób robienia tego, co próbuję osiągnąć.
choice
zamiastset
?Odpowiedzi:
Problem polega na tym, że w wierszu polecenia systemu Windows / interprecie wiersza poleceń (CLI), znanym jako CMD.EXE, występuje błąd (cóż, jestem pewien, że Microsoft uważa, że jest to funkcja), w którym, gdy czyta konstrukcję bloku, taką jak
IF … ( … )
lubFOR
pętla, to interpretuje wszystkie zmienne natychmiast , zanim pętla jest wykonywana. W twoim przykładzie, jeśli jest pusta po wejściu do bloku, wówczas wszystkie wystąpienia wewnątrz tego bloku są oceniane na zero, nawet jeśli zmienisz się w tym bloku. Możesz to zobaczyć, jeśli wyjdziesz (lub włączysz go wcześniej ).%variable_name%
ans
IF %ERRORLEVEL% NEQ 0 ( … )
%ans%
ans
ECHO
IF %ERRORLEVEL% NEQ 0
Rozwiązaniem jest powiedzenie CMD, aby zezwoliła na rozszerzenie zmiennych we właściwym czasie, gdy wykonywane są instrukcje odnoszące się do nich. Robisz to, dodając
gdzieś na początku pliku wsadowego i zmienianie kodu okna dialogowego użytkownika, aby wyglądał
za pomocą formularza, aby aktywować opóźnione rozszerzenie. Zobacz i więcej informacji.
!variable_name!
SET /?
SETLOCAL /?
źródło
SETLOCAL /?
? „Wyłączasz” aSETLOCAL
, mówiącENDLOCAL
––, i to usuwa wszystkie zmienne, które ustawiłeś od czasuSETLOCAL
, przenosi cię z powrotem do katalogu, w którym byłeś przedSETLOCAL
, i może niektórych innych rzeczy.ENDLOCAL
więc nie napotkam tych problemów.