Czy ktoś mógłby podać przykład miejsca, w którym skrypt wsadowy działałby inaczej z opóźnionym rozszerzeniem lub bez niego? Czy są jakieś sytuacje, w których NIE chcesz używać opóźnionego rozszerzenia? Dzięki.Przykład opóźnionego rozszerzenia pliku wsadowego
Odpowiedz
wygląd w następujących przykładach ...
Przykład 1: Następujący kod nie używa opóźnione ekspansji, tak więc zmienne w pętli są rozszerzone tylko jeden raz. Oznacza to, że %Count%
zawsze będzie rozwijać się 0
w każdej iteracji pętli, bez względu na to, co zrobić, aby go z zestawu poleceń:
@echo off
set COUNT=0
for %%v in (1 2 3 4) do (
set /A COUNT=%COUNT% + 1
echo Count = %COUNT%
)
pause
Więc ten skrypt wyjściowe:
Count = 0
Count = 0
Count = 0
Count = 0
to jest nie w jaki sposób ta pętla ma działać.
Przykład 2: Z drugiej strony, jeśli używamy opóźnionego rozszerzenia, mamy następujący skrypt, który będzie działał zgodnie z oczekiwaniami.
setlocal ENABLEDELAYEDEXPANSION
set COUNT=0
for %%v in (1 2 3 4) do (
set /A COUNT=!COUNT! + 1
echo Count = !COUNT!
)
pause
i, zgodnie z oczekiwaniami, to wyświetli:
Count = 1
Count = 2
Count = 3
Count = 4
Podczas korzystania z ENABLEDELAYEDEXPANSION
i poszerzyć zmienną używając !
zamiast %
, zmienna zostanie ponownie rozszerzony za każdym razem, a wszystko działa tak, jak powinno.
Chciałem dodać świetny przykład na to, jak "EnableDelayedExpansion" (EDE) może być użyteczne poza wszechobecnymi przykładami pętli FOR.
o to linia danych sejsmicznej, że używa do analizowania (I połączyć It 1line.txt)
ak_11574812 2015.04.29.193822 62,9525 -148,8849 1,0 9,5 1 49km S z Cantwell Alaska
Wystąpił problem polegający na tym, że ostatni segment tej linii nie zawsze zaczyna się od tego samego numeru kolumny. Musiałem więc stworzyć elastyczne polecenie SET, które dokładnie zrzuci ostatni segment tej linii.
ECHO OFF
setlocal enableDelayedExpansion
set where=72
set /p line=<1line.txt
set locate=!line:~%where%,28!
echo %locate%
EDE pozwala mi umieścić zmienną (gdzie) wewnątrz innej zmiennej (linii). EDE przetłumaczy zmienną w nawiasie na%, a następnie przetworzy zmienną w nawiasie! i (w tym przypadku) wypchnij wyniki do zmiennej "zlokalizuj".
Chociaż nie jest to bezpośrednio związane z pytaniem, to było jedyne miejsce, w którym udało mi się dowiedzieć, jak usunąć sub-łańcuchy, przekazując zmienne i jaka była prawidłowa kolejność! I%, więc dziękuję:) –
podaje przykład skryptu wsadowego, który działałby inaczej z lub bez opóźnionego rozszerzenia.
Dla kompletności, niech odpowie kolejną część pytania i pokazać sytuacji, w której byś nie chcą używać opóźnionego ekspansji gdy dane zawierają wykrzyknik !
(pokazywał dwa sposoby przetwarzania takich danych) :
@ECHO OFF
SETLOCAL EnableExtensions DisableDelayedExpansion
set "_auxFile=%temp%\%~n0.txt"
rem create multiline sample file
>"%_auxFile%" (for /L %%G in (1,1,3) do echo line %%G is 100%% valid! Sure! Hurrah!)
rem create one-line sample file
>"%_auxFile%" echo this line is 100%% valid! Sure! Hurrah!
echo(
echo --- file content
type "%_auxFile%"
echo(
SETLOCAL EnableDelayedExpansion
echo --- enabled delayed expansion chokes down unescaped exclamation marks^^^! "^!"
for /F "usebackq delims=" %%G in ("%_auxFile%") do (
set "_auxLine=%%~G"
echo loop var=%%~G
echo _auxLine=!_auxLine!
)
ENDLOCAL
echo(
SETLOCAL DisableDelayedExpansion
echo --- toggled delayed expansion works although might be laborious!
for /F "usebackq delims=" %%G in ("%_auxFile%") do (
set "_auxLine=%%G"
echo loop var=%%G
SETLOCAL EnableDelayedExpansion
echo _auxLine=!_auxLine!
ENDLOCAL
)
ENDLOCAL
echo(
SETLOCAL DisableDelayedExpansion
echo --- keep delayed expansion DISABLED: use CALL command!
for /F "usebackq delims=" %%G in ("%_auxFile%") do (
set "_auxLine=%%G"
echo loop var=%%G
call :ProcessVar
)
ENDLOCAL
rem delete the sample file
del "%_auxFile%"
ENDLOCAL
goto :eof
:ProcessVar
echo _auxLine=%_auxLine%
echo WARNING: neither !_auxLine! nor %%G loop variable is available here!
goto :eof
Zauważ, że powyższy scenariusz pokazuje proper ways of escaping
%
znak procent przez%%
podwojenie (opóźnione expansi nie ma znaczenia), a znak!
wykrzyknik czy opóźniony rozbudowa jest włączona:"^!"
jeśli zamknięty w cudzysłowy, a następnie użyć ogólnego charakteru ucieccmd
i partia-Script^
daszka;^^^!
w przeciwnym razie użyj trzech kostek^
.
Wyjście:
==> D:\bat\SO\10558316.bat
--- file content
this line is 100% valid! Sure! Hurrah!
--- enabled delayed expansion chokes down unescaped exclamation marks! "!"
loop var=this line is 100% valid Hurrah
_auxLine=this line is 100% valid Hurrah
--- toggled delayed expansion works although might be laborious!
loop var=this line is 100% valid! Sure! Hurrah!
_auxLine=this line is 100% valid! Sure! Hurrah!
--- keep delayed expansion DISABLED: use CALL command!
loop var=this line is 100% valid! Sure! Hurrah!
_auxLine=this line is 100% valid! Sure! Hurrah!
WARNING: !_auxLine! as well as %G loop variables are not available here!
==>
+1 tylko dla tej środkowej sekcji i łącza; Szukałem tych informacji odkąd wyszedłem z łona. – Andrew
- 1. Znajdowanie nazwy pliku uruchomionego pliku wsadowego
- 2. Uruchamianie prowizji z pliku wsadowego
- 3. wysyłanie wiadomości z pliku wsadowego
- 4. Zmiana stanu opóźnionego UIButton
- 5. Zachowywanie "=" (równych) znaków w parametrach pliku wsadowego
- 6. nazwa pliku bez rozszerzenia
- 7. Cygwin uruchamia skrypt z jednego pliku wsadowego?
- 8. Wykonywanie pliku wsadowego z C# Permission issue
- 9. Uruchamianie pliku wsadowego w powłoce git
- 10. Polecenie wielowierszowe pliku wsadowego z podwójnymi cudzysłowami
- 11. Jak zastąpić plik tekstowy z pliku wsadowego
- 12. Naciśnij klawisze klawiatury przy użyciu pliku wsadowego.
- 13. Złap błąd wewnątrz pliku wsadowego (7-zip)
- 14. Wykonaj procedurę przechowywaną z pliku wsadowego
- 15. Uruchamianie wielu aplikacji konsoli z pliku wsadowego
- 16. Uruchom plik .jar z pliku wsadowego
- 17. Kompilacja rozwiązania .net z pliku wsadowego
- 18. Tworzenie pliku wsadowego za pomocą komendy "IF"
- 19. Pobierz wersję java z pliku wsadowego
- 20. Usuwanie ukośnego ukośnika z pliku wsadowego
- 21. Polecenie pliku wsadowego PAUSE nie działa
- 22. Jak zatrzymać wczytanie pliku wsadowego Windows Batch?
- 23. Okno PowerShell po uruchomieniu z pliku wsadowego
- 24. Dołącz plik wsadowy do pliku wsadowego
- 25. Błąd testu pliku wsadowego na poziomie
- 26. Osadź VBScript wewnątrz pliku wsadowego Windows
- 27. Przekierowanie stdout i stderr z pliku wsadowego
- 28. opóźnionego zadania z i18n na szynach 3
- 29. C# Regex dla rozszerzenia pliku
- 30. Pobierz ImageFormat z rozszerzenia pliku
Dobrymi przykładami. Ale jeszcze lepiej byłoby użyć 'set/A COUNT = COUNT + 1' lub krótszego' set/A COUNT + = 1', aby zademonstrować, że w wyrażeniu __arithmetic__ można odwoływać się do zmiennych tylko ich nazwami. Wyrażenie __arithmetic__ jest ciągiem po 'set/A'. Wyjście pomocy działające w oknie wiersza poleceń 'set /?' Wyjaśnia opóźnione rozszerzenie w przykładzie __IF__ i __FOR__, a także specjalną zmienną parsującą w wyrażeniach arytmetycznych. – Mofi