2010-02-24 21 views
195

değişkenine atayın Bir programın çıkışını bir MS toplu iş dosyası kullanarak bir değişkene atamam gerekiyor.1 Bir programın çıkışını

GNU Bash kabuğunda VAR=$(application arg0 arg1) kullanırdım. Windows'da bir toplu iş dosyası kullanarak benzer bir davranışa ihtiyacım var.

set VAR=application arg0 arg1 gibi bir şey.

cevap

292

Tek yoludur:

application arg0 arg1 > temp.txt 
set /p VAR=<temp.txt 

Başka geçerli:

%%i ilk % ondan sonra % kaçmak için kullanılır ve bir toplu iş dosyasında yerine komut satırında yukarıdaki kodu kullanılırken gereklidir
for /f %%i in ('application arg0 arg1') do set VAR=%%i 

Not. senin test.bat gibi bir şey vardır, düşünün:

for /f %%i in ('c:\cygwin64\bin\date.exe +"%%Y%%m%%d%%H%%M%%S"') do set datetime=%%i 
echo %datetime% 
+7

Bu harika bir hile, neden bir boruyla çalışmadığını merak ediyorum –

+11

Bu yalnızca tek bir satır metni olan çıktı için çalışıyor (sonraki satırlar ilk satır sonundan sonra atlandı). – GroovyCakes

+14

@Machta borusunun, daha önce bir^işareti ile, parens'teki ifadenin içinde yer alması gerekir. Örnek: 'for/f" tokens = 3 "%% i in ('route print^| findstr" \ <0.0.0.0\> "')" myVar = %% i "' –

6

uygulamanızın çıkış sayısal dönüş kodu olduğunu varsayarak, aşağıdaki

application arg0 arg1 
set VAR=%errorlevel% 
+2

Yürütülmem gerekiyordu Ne yazık ki, çıktı bir dizedir. – initialZero

+0

ok. Bunu jüri için tutacağım, ama bir temp dosyasına pipetleme çıkışı hakkında konuşan @ jdigital'nin bağlantısına bir göz atacağım. – akf

+0

Programın stdout ve stderr'e çıkışı, tamsayı döndürme değerinden farklıdır. Bir program, hem yukarıdaki örnekte olduğu gibi bir tamsayı değerini döndürürken, hem de konsola bir dize (veya bir dosyaya veya başka bir yere yönlendirilir) gönderebilir. Bunlar karşılıklı olarak münhasır değildir ve iki farklı kavramdır. –

7

@OP yapabildiği tek şey sayılar dışındaki bir yanıt versin, sen, programın dönüş durumunu yakalamak için for loops kullanabilirsiniz

51

this previous answer bir ek olarak, borular bir şapka sembolle kaçan, for ifadesinin içine kullanılabilir: cevaba ek olarak

for /f "tokens=*" %%i in ('tasklist ^| grep "explorer"') do set VAR=%%i 
+1

İki önemli nokta: Boruyu kaçmak ve yakalamak için simgeleri kullanın. –

+0

CLI'de çalışan ve daha kolay düzeltme için kopyala yapıştırılabilen eşdeğer sürüm: 'for/f" tokens = * "% i in ('tasklist^| findstr explorer') do @% ico% i' yapmak "usebackq" karmaşık komutları işlemek için kullanılmalıdır. –

1

, sen döngüsünün döngüsündeki çıkış yönlendirmesi işleçlerini doğrudan kullanamazsınız (örn. stderror çıktısını bir kullanıcıdan gizlemek ve daha iyi bir hata iletisi sağlamak istiyorsanız). Bunun yerine, bir şapka karakteri (^) ile kaçmak zorunda:

for /f %%O in ('some-erroring-command 2^> nul') do (echo %%O) 

Referans: Redirect output of command in for loop of batch script

0
@echo off 
SETLOCAL ENABLEDELAYEDEXPANSION 

REM Prefer backtick usage for command output reading: 
REM ENABLEDELAYEDEXPANSION is required for actualized 
REM outer variables within for's scope; 
REM within for's scope, access to modified 
REM outer variable is done via !...! syntax. 

SET CHP=C:\Windows\System32\chcp.com 

FOR /F "usebackq tokens=1,2,3" %%i IN (`%CHP%`) DO (
    IF "%%i" == "Aktive" IF "%%j" == "Codepage:" (
     SET SELCP=%%k 
     SET SELCP=!SELCP:~0,-1! 
    ) 
) 
echo actual codepage [%SELCP%] 

ENDLOCAL 
2

yürütülüyor üzerinde: for /f %%i in ('application arg0 arg1') do set VAR=%%i i hatayı başlamıştı: %% i şu anda beklenmedik oldu. Bir düzeltme olarak, yukarıdaki i for /f %i in ('application arg0 arg1') do set VAR=%i

+1

Bir toplu iş dosyasında '%%' ve bir komut satırında bir toplu iş dosyasının olması gerekir. –