Cara mengatur output perintah sebagai variabel dalam file batch

243

Apakah mungkin untuk mengatur output pernyataan dari file batch ke variabel, misalnya:

findstr testing > %VARIABLE%

echo %VARIABLE%
Dennis
sumber

Jawaban:

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

Saya selalu menggunakan USEBACKQ sehingga jika Anda memiliki string untuk memasukkan atau nama file yang panjang, Anda dapat menggunakan tanda kutip ganda tanpa mengacaukan perintah.

Sekarang jika output Anda akan berisi banyak baris, Anda dapat melakukan ini

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
Mechaflash
sumber
3
Bekerja untuk saya di sistem Win7, terima kasih! (dan ya, ini berguna selama 7 tahun) PS Jangan lupa untuk memperluas% ke %% dalam perintah!
Dmitry Ilukhin
Ini berfungsi dengan baik ... kecuali jika outputnya mengandung tanda seru (!), Karena ini akan ditafsirkan sebagai karakter kontrol saat menggunakanENABLEDELAYEDEXPANSION
JonathanDavidArndt
Ini berfungsi dengan baik, kecuali jika Anda perlu menggunakan |dalam hal ini tidak berfungsi.
Matt Vukomanovic
6
@MattVukomanovic berfungsi untuk saya gunakan ^|di tempat |, seperti yang dijelaskan di sini
AST
Apakah mungkin untuk mengambil kode keluar command? Saya yakin itu mengembalikan kode non-nol tetapi %ERRORLEVEL%selalu berisi 0, di mana pun saya mencoba menggunakannya (bahkan di dalam doblok). Jadi saya kira beberapa bagian dari forkonstruksi itu menimpanya. BTW Tidak bisa dipercaya betapa gila kode dibutuhkan untuk sesuatu yang sangat mendasar.
David Ferenczy Rogožan
69

Saya menemukan utas ini pada hal Interweb itu. Bermuara ke:

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

Anda juga dapat mengarahkan output dari perintah ke file sementara, dan kemudian memasukkan konten file sementara itu ke dalam variabel Anda, seperti demikian juga. Ini tidak bekerja dengan input multiline.

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

Kredit ke utas di Perangkat Keras Tom.

lumba-lumba
sumber
3
Hanya pendekatan drawback to bottom (yang lebih disukai dalam semua cara lain) adalah bahwa itu tidak bekerja dengan output multi-line.
Lakukan
Untuk VER saya akan pergi dengan cara lain: untuk / f "token = 2 delims = [,]" %% a in ('ver') lakukan setel versi %% a echo% versi%
Hardoman
1
Anda adalah hasil kedua untuk likesuchashereby - imagebin.ca/v/4NPSlQFgifce
Shmuel Kamensky
Contoh kedua Anda sangat membantu saya dalam menulis file batch untuk memeriksa versi chromedriver.exe versus file teks yang berisi nomor versi. Saya dinosaurus DOS lama, dan tidak menyadari switch ke perintah yang ditetapkan. Hal-hal lain terlalu berat bagi saya.
Bill Hileman
47

dalam satu baris:

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

output perintah akan diatur dalam% g kemudian di VAR.

Informasi lebih lanjut: https://ss64.com/nt/for_cmd.html

Yuri
sumber
19
Batch saya tidak berjalan dengan "% g". Itu dijalankan dengan "%% g".
Santiago Villafuerte
5
+ Santiago Villafuerte: ya, jika Anda menjalankan dari file batch, tetapi jika Anda ingin menjalankannya sendiri dari baris perintah (misalnya: untuk mengujinya sebelum memasukkannya ke file batch) maka Anda menggunakan% tunggal.
Brent Rittenhouse
19

Untuk membaca file ...

set /P Variable=<File.txt

Untuk Menulis file

@echo %DataToWrite%>File.txt

catatan; memiliki spasi sebelum karakter <> menyebabkan spasi ditambahkan di akhir variabel, juga

Untuk menambah file, seperti program logger, Pertama buat file dengan kunci enter tunggal di dalamnya yang disebut e.txt

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

log Anda akan terlihat seperti ini

Entry1
Entry2 

dan seterusnya

Bagaimanapun beberapa hal berguna


sumber
Terima kasih atas jawaban Anda. BTW "set / P Variable = <File.txt" hanya membaca baris pertama file
Deepscorn
19

Semua jawaban ini sangat dekat dengan jawaban yang saya butuhkan. Ini adalah upaya untuk mengembangkannya.

Dalam file Batch

Jika Anda menjalankan dari dalam .batfile dan Anda ingin satu baris yang memungkinkan Anda untuk mengekspor perintah yang rumit seperti jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.jsonke variabel bernama AWS_ACCESS_KEYmaka Anda ingin ini:

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

Di Baris Perintah

Jika Anda pada C:\prompt Anda ingin satu baris yang memungkinkan Anda untuk menjalankan perintah yang rumit seperti jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.jsonuntuk variabel bernama AWS_ACCESS_KEYmaka Anda menginginkan ini:

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

Penjelasan

Satu-satunya perbedaan antara dua jawaban di atas adalah bahwa pada baris perintah, Anda menggunakan% tunggal dalam variabel Anda. Dalam file batch, Anda harus menggandakan pada tanda-tanda persentase (%%).

Karena perintah menyertakan titik dua, tanda kutip, dan tanda kurung, Anda harus memasukkan USEBACKQbaris dalam opsi sehingga Anda dapat menggunakan tanda kutip untuk menentukan perintah yang akan dijalankan dan kemudian semua jenis karakter lucu di dalamnya.

Ryan Shillington
sumber
13

Jika Anda tidak ingin menampilkan ke file temp dan kemudian membaca ke dalam variabel, kode ini menyimpan hasil perintah langsung ke dalam variabel:

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

Jika Anda ingin melampirkan string pencarian dalam tanda kutip ganda:

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

Jika Anda ingin menyimpan kode ini dalam file batch, tambahkan simbol% ​​ekstra:

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

Contoh yang berguna untuk menghitung jumlah file dalam direktori & simpan dalam variabel: (menggambarkan perpipaan)

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

Perhatikan penggunaan tanda kutip tunggal, bukan tanda kutip ganda "atau aksen kubur` dalam tanda kurung perintah. Ini adalah alternatif yang lebih bersih untuk delims, tokensatau usebackqdalam forlingkaran.

Diuji pada Win 10 CMD.

Zimba
sumber
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
Dado
sumber
Saya tidak bisa melihat bagaimana ini memecahkan pertanyaan. appcmdbukan program standar dan saya tidak bisa melihat di mana Anda menetapkan output program ke variabel. Akhirnya Anda perlu penjelasan lebih lanjut
jeb
-3

Saya telah mengujinya seperti ini dan berhasil:

SET /P Var= | Cmd

Dengan memipakan perintah ke variabel, prompt akan memasukkan hasil dari perintah " Cmd" ke dalam variabel " Var".

Memperbarui:

Tidak berfungsi, salah saya, skrip yang saya lakukan adalah ini:

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

Itu sebenarnya menunjukkan katakanlah " test.txt", tetapi sebenarnya menunjukkan hasil dari perintah " dir /b *.txt", bukan echo %var%. Saya bingung karena kedua outputnya sama.

QcAlexN
sumber
3
Jika Anda berniat pipe the command into a variable promptmaka Anda harus menulisnya dir /b *.txt | SET /P Var=untuk mendapatkan arah pipa yang benar. PS: Tidak juga begitu!
Jesse Chisholm
-18

Semoga bantuan ini

set a=%username%
echo %a%    
set a="hello"
echo %a%
Ben2014
sumber
5
Tidak, ini tidak menjawab pertanyaan. Pertanyaannya adalah untuk mendapatkan output dari suatu perintah ke dalam variabel
jeb
Cara mudah adalah menulis ke file dan membacanya dari file itu. findstr "test" test.txt> testoutput.txt set /pa=<testoutput.txt gema% a%
Ben2014