sorunu code block
(tabloların parenthesised serisi) içinde herhangi %var%
parse time
de değişkenin gerçek değeri ile değiştirilecektir olmasıdır.
Hin ilk örneğiniz, %errorlevel%
0
ve bu şekilde yankılandı. İkinci örnekte, for
karşılaşıldığında, 1
, dolayısıyla 1
ile değiştirilir.Eğer bir döngü içinde değiştirilebilir bir ortam değişkeninin değerini görüntülemek istiyorsanız
, o zaman üç şeyden birini yapmanız gerekir:
Invoke setlocal enabledelayedexpansion
ve %var%
yerine !var!
yankı - belirterek Aktif olabileceğiniz iç içe geçmiş setlocal
talimatlarının sayısı sınırlıdır.
Çağrı bir altprogram bir sözdizimi-istismar
Istihdam.
SO üzerinde delayedexpansion
ilgili birçok pek çok madde vardır. vaka döngü kontrol değişkeni (metavariable
durumunda haricinde, toplu ölçüde ilgisiz - -
Kabaca, sadece notu (kullanabilirsiniz bu durumda %%i
)
@echo off
setlocal ENABLEDELAYEDEXPANSION
echo blah | findstr bin > NUL
echo %ERRORLEVEL% or !errorlevel!
for /f %%i in ('cmd /c echo blah') do (
echo %%i | findstr bin > NUL
echo %ERRORLEVEL% or !errorlevel!
)
başka yolu da dinamik etmektir setlocal
@echo off
setlocal
echo blah | findstr bin > NUL
echo %ERRORLEVEL% or !errorlevel!
for /f %%i in ('cmd /c echo blah') do (
echo %%i | findstr bin > NUL
setlocal ENABLEDELAYEDEXPANSION
echo %ERRORLEVEL% or !errorlevel!
endlocal
)
çağırmak bunun dezavantaj dışarı endlocal
sırtları son setlocal
yana çevreye yapılan değişiklikler. Ayrıca unutmayın o 012 iseetkin değil, !
artık özel bir karakter değil. Eğer geleneksel tarzda errorlevel
kullanabilirsiniz
Veya:
"errorlevel n daha büyüktür n
ise ya da" bu errorlevel
ve if errorlevel n
ait run-time
değeri bakar @echo off
setlocal
echo blah | findstr bin > NUL
echo %ERRORLEVEL% or !errorlevel!
for /f %%i in ('cmd /c echo blah') do (
echo %%i | findstr bin > NUL
if errorlevel 1 (echo errorlevel is 1 or greater
) else (echo errorlevel is 0
)
)
Not demektir
Veya bir alt yordamı çağırın:
Bu Veya, bir alt program kullanarak bu özel sürümü "fiziksel-sonu dosyaya gidin" anlamına - - goto :eof
(burada kolon önemli olduğunu buradaNot sözdizimi-istismar
@echo off
setlocal
echo blah | findstr bin > NUL
echo %ERRORLEVEL% or !errorlevel!
for /f %%i in ('cmd /c echo blah') do (
echo %%i | findstr bin > NUL
call echo %%errorlevel%%
)
Yinelenen http://stackoverflow.com/questions/10558316/example-of-delayed-expansion-in-batch-file sayfasının Deneyin: echo! ERRORLEVEL! '; Bu [gecikmeli genişleme] (https://blogs.msdn.microsoft.com/oldnewthing/20060823-00/?p=29993). Bunu, "setlocal enabledelayedexpansion" ile etkinleştirebilirsiniz. – CristiFati