2016-03-26 20 views
0

için içinde ERRORLEVEL'ı belirlememenizi FINDSTR kimse bana açıklayabilir neden şu pasajı baskılar 0:, Windows Toplu: döngü

@echo off 
setlocal 

for /f %%i in ('cmd /c echo blah') do (
    echo %%i | findstr bin > NUL 
    echo %ERRORLEVEL% 
) 

başka eklerken, dışında eşdeğer tablosu için-döngü bu 1 1 yazdırmak yapar:

@echo off 
setlocal 

echo blah | findstr bin > NUL 
echo %ERRORLEVEL% 

for /f %%i in ('cmd /c echo blah') do (
    echo %%i | findstr bin > NUL 
    echo %ERRORLEVEL% 
) 

Ben Toplu bir newbie biraz değilim, bu yüzden iki ifade ilgisiz görünmektedir çünkü bu bana biraz gizemli. Bu konuda herhangi bir yardım mutluluk duyacağız!

+2

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

cevap

4

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:

  1. 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.

  2. Çağrı bir altprogram bir sözdizimi-istismar

  3. 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%% 
) 
+0

Güzel. Sözdizimi sömürüsü hakkında bir şey bilmiyordum. Herhangi bir yerde belgelenmiş mi? – DavidPostill

+0

@DavidPostill: Resmi bir dokümantasyon görmedim - OTOH, ben de bakmadım. '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' Işlevini kullanarak ayrıştırma sistemini kullanarak çalışır; Aynı değişken, dolaylı olarak bir değişkene "set set var = %% var2 %%" hakkında da yapılabilir. – Magoo

+0

Teşekkürler. Bazı durumlarda gecikmeli genişletme kullanmaktan daha kolay görünüyor;) – DavidPostill

0

GÜNCELLEME:

beklendiği gibi çalıştığını ifade için kapanış ) sonra echo %ERRORLEVEL% deyimi koyarsanız

.

for /f %%i in ('cmd /c echo blah') do (
    echo %%i | findstr bin > NUL 
) 
echo %ERRORLEVEL% 

ben tür kesin 'kesin' bir nedenden dolayı, burada tahmin ediyorum, ama setlocal kesinlikle buna neden oluyor. For döngüsü içinde ERRORLEVEL değerini varsayıyorum cmd /c ... deyiminin sonucudur. Garip bir davranış gibi görünüyor, ama toplu dosyalarda daha kötü gördüm. Eğer başında setlocal kaldırırsanız kimse beklemek normalde gibi

çalıştığını bunun için .. ORİJİNAL

:

findstr setleri errorlevel o çalışır. Yani, echo %errorlevel% çıkış daima olacak 0. o maçı ile çizgiyi (kendisine geçirilen tek çizgi) verir, böylece aşağıdaki Findstr açıklamada, başarılı Örneğin

: bu açıklama olmasa da

C:\>echo blahbin | findstr bin 
blahbin 
C:\>echo %errorlevel% 
0   ; success/found it.. 

başarılı (findstr Herhangi bir çıktı yapar) ve errorlevel 1 olarak ayarlanır:

C:\>echo blah_in | findstr bin 
C:\>echo %errorlevel% 
1   ; failed 
+0

Yanıtladığınız için teşekkür ederiz. Sorun bu değil, sorun '1' çıktığında '0' (sorumun ilk bölümünde) çıktı olmasıdır. –

+0

Evet, fark ettim ki .. Sadece bir saniye. – wasatchwizard

0
@echo off 
setlocal ENABLEDELAYEDEXPANSION 

for /f %%i in ('cmd /c echo blah') do (
    echo %%i | findstr bin > NUL 
    echo !ERRORLEVEL! 
) 

bu çalışması gerekir.

A cmd için bir döngü teknik olarak bir satırdır, bu nedenle değişken yalnızca bir kez genişletilir. Yüzde yerine ünlem işareti kullanılması ve "ENABLEDELAYEDEXPANSION" düzeltmesi gerekir.

İlgili konular