Bir toplu iş dosyasında komut çıktısını değişken olarak ayarlama


242

Bir ifadenin toplu iş dosyası çıktısını bir değişkene ayarlamak mümkün müdür, örneğin:

findstr testing > %VARIABLE%

echo %VARIABLE%





Yanıtlar:


275
FOR /F "tokens=* USEBACKQ" %%F IN (`command`) DO (
SET var=%%F
)
ECHO %var%

Eklemek için bir dizeniz veya uzun bir dosya adınız varsa, komutu bozmadan çift tırnaklarınızı kullanabilmeniz için her zaman USEBACKQ kullanıyorum.

Şimdi çıktınız birden fazla satır içerecekse bunu yapabilirsiniz

SETLOCAL ENABLEDELAYEDEXPANSION
SET count=1
FOR /F "tokens=* USEBACKQ" %%F IN (`command`) DO (
  SET var!count!=%%F
  SET /a count=!count!+1
)
ECHO %var1%
ECHO %var2%
ECHO %var3%
ENDLOCAL

3
Win7 sisteminde benim için çalıştı, teşekkürler! (ve evet, 7 yıllık kullanışlılık) PS Komutlarda %% %% değerine genişletmeyi unutmayın!
Dmitry Ilukhin

Bu harika çalışıyor ... Çıktı ünlem noktaları (!) İçermedikçe, bunlar kullanıldığında kontrol karakterleri olarak yorumlanacaktırENABLEDELAYEDEXPANSION
JonathanDavidArndt

Kullanmanız gerekiyorsa |, bu durumda işe yaramazsa iyi çalışır.
Matt Vukomanovic

6
@MattVukomanovic o kullanarak benim için çalışıyor ^|yerine |açıklandığı gibi, burada
AST

Herhangi bir şekilde çıkış kodunu yakalamak mümkün mü commandlütfen? Sıfır olmayan bir kod döndürüyor eminim ama %ERRORLEVEL%her zaman 0 içerir, nerede kullanmaya çalışacağım önemli değil (hatta doblok içinde ). Sanırım bu foryapının bir kısmı üzerine yazılıyor. BTW Bu kadar basit bir şey için çılgın görünümlü kodun ne kadar gerekli olduğu inanılmaz.
David Ferenczy Rogožan

69

Bulduğum Konuyu orada Interweb şey bu konuda. İndirgenir:

@echo off 
setlocal enableextensions 
for /f "tokens=*" %%a in ( 
'VER' 
) do ( 
set myvar=%%a 
) 
echo/%%myvar%%=%myvar% 
pause 
endlocal 

Ayrıca bir komutun çıktısını geçici bir dosyaya yönlendirebilir ve daha sonra bu geçici dosyanın içeriğini beğeninize değişken olarak ekleyebilirsiniz. Gerçi çok satırlı girdi ile çalışmaz.

cmd > tmpFile 
set /p myvar= < tmpFile 
del tmpFile 

Tom's Hardware başlıklı konuya teşekkür ederiz.


3
Alt yaklaşıma tek dezavantaj (diğer tüm yollarla tercih edilir), çok satırlı çıktı ile çalışmaz.
dgo

VER için başka bir yoldan giderdim: / f "tokens = 2 delims = [,]" %% a in ('ver') sürümü %% bir echo% version%
ayarladı

1
likesuchashereby - ikinci sonucu elde edersiniz - imagebin.ca/v/4NPSlQFgifce
Shmuel Kamensky

İkinci örneğiniz, chromedriver.exe'nin sürüm numarasını içeren bir metin dosyasına karşı bir toplu iş dosyası yazmama yardımcı oldu. Eski bir DOS dinozoruyum ve set komutuna geçişin farkında değildim. Diğer şeyler benim için aşırıya kaçmıştı.
Bill Hileman

47

tek bir satırda:

FOR /F "tokens=*" %g IN ('*your command*') do (SET VAR=%g)

komut çıkışı% g sonra VAR olarak ayarlanır.

Daha fazla bilgi: https://ss64.com/nt/for_cmd.html


19
Toplu işim "% g" ile çalışmadı. "%% g" ile çalıştı.
Santiago Villafuerte

5
+ Santiago Villafuerte: evet, bir toplu iş dosyasından çalıştırıyorsanız, ancak komut satırından kendiniz çalıştırmak istiyorsanız (örneğin: toplu iş dosyasına koymadan önce test etmek için) tek bir% kullanın.
Brent Rittenhouse

19

Bir dosyayı okumak için ...

set /P Variable=<File.txt

Dosya yazmak için

@echo %DataToWrite%>File.txt

Not; <> karakterinden önce boşluk olması değişkenin sonuna boşluk eklenmesine neden olur.

Bir günlükçü programı gibi bir dosyaya eklemek için, önce içinde e.txt adlı tek bir giriş tuşu bulunan bir dosya oluşturun

set /P Data=<log0.log
set /P Ekey=<e.txt
@echo %Data%%Ekey%%NewData%>log0.txt

günlüğün şöyle görünecek

Entry1
Entry2 

ve bunun gibi

Her neyse birkaç yararlı şey


Cevabınız için teşekkür ederim. BTW "set / P Variable = <File.txt" sadece dosyanın ilk satırını okur
Deepscorn

19

Bu cevapların hepsi ihtiyacım olan cevaba çok yakındı. Bu onları genişletme çabasıdır.

Bir Toplu iş dosyasında

Bir .batdosyadan çalıştırıyorsanız ve jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.jsonadlı bir değişkene benzer karmaşık bir komutu dışa aktarmanıza izin veren tek bir satır istiyorsanız, AWS_ACCESS_KEYbunu istiyorsanız:

FOR /F "tokens=* USEBACKQ" %%g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%%g")

Komut Satırında

İstendiğinde, adlı bir değişkene C:\benzer karmaşık bir komut çalıştırmanıza izin veren tek bir satır istiyorsanız, bunu istiyorsanız:jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.jsonAWS_ACCESS_KEY

FOR /F "tokens=* USEBACKQ" %g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%g")

açıklama

Yukarıdaki iki cevap arasındaki tek fark, komut satırında değişkeninizde tek bir% kullanmanızdır. Bir toplu iş dosyasında, yüzde işaretlerini (%%) ikiye katlamanız gerekir.

Komut, iki nokta üst üste, tırnak işaretleri ve parantez içerdiğinden, USEBACKQçalıştırılacak komutu ve ardından içindeki her tür komik karakteri belirtmek için geri tırnakları kullanabilmeniz için satırı seçeneklere eklemeniz gerekir.


13

Bir geçici dosyaya çıktı almak ve daha sonra bir değişkene okumak istemiyorsanız, bu kod komutun sonucunu doğrudan bir değişkene depolar:

FOR /F %i IN ('findstr testing') DO set VARIABLE=%i
echo %VARIABLE%

Arama dizesini çift tırnak içine almak istiyorsanız:

FOR /F %i IN ('findstr "testing"') DO set VARIABLE=%i

Bu kodu bir toplu iş dosyasında saklamak istiyorsanız, fazladan bir% simgesi ekleyin:

FOR /F %%i IN ('findstr "testing"') DO set VARIABLE=%%i

Bir dizindeki dosya sayısını ve bir değişkende saklamak için yararlı bir örnek: (boruları gösterir)

FOR /F %i IN ('dir /b /a-d "%cd%" ^| find /v /c "?"') DO set /a count=%i

Yerine komut parantez içinde çift tırnak "ya da aksan` tek tırnak kullanımına dikkat edin. Bu temizleyici için alternatif delims, tokensya usebackqiçinde fordöngü.

Win 10 CMD üzerinde test edildi.


1
cd %windir%\system32\inetsrv

@echo off

for /F "tokens=* USEBACKQ" %%x in (      
        `appcmd list apppool /text:name`
       ) do (
            echo|set /p=  "%%x - " /text:name & appcmd.exe list apppool "%%x" /text:processModel.identityType
       )

echo %date% & echo %time%

pause

Bunun soruyu nasıl çözdüğünü göremiyorum. appcmdstandart bir program değildir ve bir değişkene program çıktısını nereye atadığınızı göremiyorum. Sonunda biraz daha açıklamaya ihtiyacın var
jeb

-3

Ben böyle test ve çalıştı:

SET /P Var= | Cmd

Komutu bir değişkene pipetlediğinizde, komut istemi " Cmd" komutunun sonucunu " " değişkenine ekler Var.

Güncelleme:

İşe yaramıyor, benim kötü, yaptığım komut şuydu:

SET /P Var= | dir /b *.txt
echo %Var%

Aslında " test.txt" diyelim , ama aslında " dir /b *.txt" komutunun sonucunu gösteriyordu echo %var%. Her iki çıktı da aynı olduğu için kafam karıştı.


3
Eğer istediyseniz, boru yönünüzü düzeltmek için pipe the command into a variable promptyazmış olmalısınız dir /b *.txt | SET /P Var=. PS: Bu da işe yaramıyor!
Jesse Chisholm

-18

Umarım bu yardım

set a=%username%
echo %a%    
set a="hello"
echo %a%

5
Hayır, bu question.The soru değişken içine komutun çıktısını almak için yaklaşık mi cevap vermez
jeb

Kolay yol bir dosyaya yazmak ve o dosyadan okumaktır. findstr "test" test.txt> testoutput.txt kümesi /pa=<testoutput.txt echo% a%
Ben2014 18:15
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.