2010-05-18 16 views
10

yok eder ben borusu bir günlük dosyası içine bir senaryonun çıktı eğer:Windows toplu dosyası: Boru mümkündür da errorlevel dönmek benim dönüş kodu

test1.bat:

call test2.bat 2>&1 | tee log.txt 
echo ERRORLEVEL: %ERRORLEVEL% 

test2.bat:

exit /B 1 

Çıktı çağıran test1.bat:

ERRORLEVEL: 0 

ErrorLevel daima sorundur 0.

, ben bu nedenle çıkış komut satırında gösterilen çıkışı ile eşzamanlı olarak yönlendirilmesi gereken senaryom içinde başka komut çağırmak için basit istiyoruz > benim için yeterli değil. :(

Bana herhangi bir başka önerileri verebilir ... Birkaç fikirleri çalıştı, ancak sonuç borusu her zaman verilen hata seviyesini yok etmek görünüyor ki? Peşin

Teşekkür ... :)

Cevabınız için

Teşekkür ... ne yazık ki bu kadar iyi çalışmıyor ... ne denedim bak :(:

test1.bat:

echo off 
set VAR1=" " 
echo VAR1 before test2: %VAR1% 
call test2.bat 2>&1 | tee log.txt 
echo VAR1 after test2: %VAR1% 

dnm2: test1.bat çağıran

@echo off 
set VAR1=ERROR 
echo VAR1 in test2: %VAR1% 
exit /B 1 

Çıktı:

VAR1 before test2: " " 
VAR1 in test2: ERROR 
VAR1 after test2: " " 

Ben "ErrorValue: 1" kurtarmaya çalıştı bir diğer çözüm olarak durumunda günlük dosyası içine bir hata var. E-postada, bu dizeyi arayan günlüğü ayrıştırmak istedim. Maalesef yanı çalışmıyor bir ortam değişkeni bulmak-sonuç tasarrufu, ben şöyle yaptım gibidir:

FOR /F "tokens=1 delims=" %%A in ('type %logDir%\03_applySqls.log | find /c "ERRORVALUE: 1"') do SET val=%%A 

Hata alıyorum:

"|" ist syntaktisch an dieser Stelle nicht verarbeitbar. 

Peki nasıl en azından benim günlük dosyasına ayrıştırmak ve edebilirsiniz dize bir errorlevel olarak değer döndürebilir günlüğüne bulunur davası?

+0

çok ilgili: http://stackoverflow.com/questions/11170753/windows-command-interpreter-how-to-obtain-exit-code-of-first -piped-komuta – eckes

cevap

1

Eh, sorun olduğunu ve bu nedenle kendi çıkış kodu toplu iş dosyasının üzerine yazılır Toplu iş dosyanıza sonra tee çıkışlar.

başka hata işleme mekanizmasını kullanmak dışında kadar, bu konuda yapabileceği değil (bildiğim kadarıyla) var. Toplu işinizin çıkış kodunu saklamak için bir ortam değişkeni kullanabilirsiniz. tee o dokunmayacak.

1

ne dersiniz:

FOR /F "tokens=1 delims=" %%A in ('find /c "ERRORVALUE: 1" %logDir%\03_applySqls.log') do SET val=%%A 
2

Pis. Sadece geçirilen bir komutun çıkış kodunu silen bir sarmalayıcı toplu iş dosyası önerebilirim. Bir ortam değişkeni burada hardalı kesmeyecek. Ben kullanılmayan bir fd bunu yazarken öneririz, 4.

wr.cmd ki: denir wr.cmd zaman

call %* 
echo %errorlevel% >&4 
echo Some error message >&2 

Bu açık olmalıdır fd 4 olarak biraz zordur. Sake'i test etmek için, bu metnin hata seviyesinden ayrı kaldığını göstermek için Some error message'u stderr'e ekledim.

test1.bat:

call wr test2.bat 4>fail.txt 2>&1 | tee log.txt 
set /p fail= <fail.txt 
echo FAIL: %fail% 
İlgili konular