วิธีตั้งค่าคำสั่งเอาต์พุตเป็นตัวแปรในไฟล์แบตช์


242

เป็นไปได้หรือไม่ที่จะตั้งค่าเอาต์พุตของชุดคำสั่งของแบตช์ไฟล์เป็นตัวแปรตัวอย่างเช่น:

findstr testing > %VARIABLE%

echo %VARIABLE%

2
เป็นไปได้ที่ซ้ำกันของชุดเทียบเท่าของ Bash backticks
Cristian Ciupitu

จริง ๆ แล้วดูเหมือนว่าต้นฉบับจะเป็นฉันจะได้ผลลัพธ์ของคำสั่งในตัวแปรใน windows ได้อย่างไร .
Cristian Ciupitu

มีความเป็นไปได้ซ้ำของไฟล์แบตช์
นาธาน

อื่นที่ซ้ำกันเพื่อความสนุกสนาน: แบทช์ Windows กำหนดเอาต์พุตของโปรแกรมให้กับตัวแปร
icc97

คำตอบ:


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

ฉันมักจะใช้ USEBACKQ เพื่อที่ว่าถ้าคุณมีสตริงที่จะแทรกหรือชื่อไฟล์ที่ยาวคุณสามารถใช้เครื่องหมายคำพูดคู่ของคุณได้โดยไม่ต้องพลาดคำสั่ง

ตอนนี้ถ้าผลลัพธ์ของคุณจะมีหลายบรรทัดคุณสามารถทำได้

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 ขอบคุณ! (และใช่มันมีประโยชน์เต็มที่ 7 ปี) PS อย่าลืมที่จะขยายคำสั่ง% ถึง %%!
Dmitry Ilukhin

วิธีนี้ใช้งานได้ดี ... เว้นแต่ว่าเอาต์พุตจะมีเครื่องหมายอัศเจรีย์ (!) เนื่องจากสิ่งเหล่านี้จะถูกตีความว่าเป็นอักขระควบคุมเมื่อใช้ENABLEDELAYEDEXPANSION
JonathanDavidArndt

มันทำงานได้ดียกเว้นถ้าคุณจำเป็นต้องใช้|ในกรณีที่มันไม่ทำงาน
Matt Vukomanovic

6
@MattVukomanovic มันใช้งานได้สำหรับฉัน^|แทน|, ตามที่อธิบายไว้ที่นี่
AST

เป็นไปได้ไหมที่จะจับรหัสออกได้commandแต่อย่างใด ฉันแน่ใจว่ามันส่งคืนรหัสที่ไม่ใช่ศูนย์ แต่%ERRORLEVEL%มี 0 เสมอไม่ว่าฉันจะพยายามใช้งานที่ไหน (แม้อยู่ในdoบล็อก) ดังนั้นฉันคิดว่าบางส่วนของforโครงสร้างนั้นเขียนทับมัน BTW มันไม่น่าเชื่อว่ารหัสที่ดูบ้าเป็นสิ่งจำเป็นสำหรับบางสิ่งบางอย่างในระดับประถมศึกษา
David Ferenczy Rogožan

69

ฉันพบกระทู้นี้ว่ามีสิ่ง Interweb เดือดลงไปที่:

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

นอกจากนี้คุณยังสามารถเปลี่ยนเส้นทางการส่งออกของคำสั่งไปยังไฟล์ชั่วคราวจากนั้นนำเนื้อหาของไฟล์ชั่วคราวนั้นไปไว้ในตัวแปรของคุณเช่นเดียวกันโดยที่ มันไม่ทำงานกับอินพุตหลายบรรทัด

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

เพิ่มเครดิตให้กับฮาร์ดแวร์ของทอม


3
เฉพาะข้อเสียเปรียบวิธีล่าง (ซึ่งเป็นที่นิยมในรูปแบบอื่น ๆ ทั้งหมด) คือมันไม่ทำงานกับการส่งออกหลายบรรทัด
dgo

สำหรับ VER ฉันจะใช้วิธีอื่น: สำหรับ / f "โทเค็น = 2 delims = [,]" %% a ใน ('ver') ให้ตั้งค่ารุ่น %% a echo% รุ่น%
Hardoman

1
คุณคือผลลัพธ์ที่สองของ Likesuchashereby - imagebin.ca/v/4NPSlQFgifce
Shmuel Kamensky

ตัวอย่างที่สองของคุณช่วยฉันอย่างมากในการเขียนแบตช์ไฟล์เพื่อตรวจสอบเวอร์ชันของ chromedriver.exe กับไฟล์ข้อความที่มีหมายเลขเวอร์ชัน ฉันเป็นไดโนเสาร์ DOS ตัวเก่าและไม่ทราบว่าสวิตช์เป็นคำสั่ง set สิ่งอื่น ๆ ถูก overkill สำหรับฉัน
Bill Hileman

47

ในบรรทัดเดียว:

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

เอาต์พุตคำสั่งจะถูกตั้งค่าเป็น% g จากนั้นใน VAR

ข้อมูลเพิ่มเติม: https://ss64.com/nt/for_cmd.html


19
ชุดของฉันไม่ได้ทำงานด้วย "% g" มันวิ่งด้วย "%% g"
Santiago Villafuerte

5
+ Santiago Villafuerte: ใช่ถ้าคุณกำลังเรียกใช้จากแฟ้มแบตช์ แต่ถ้าคุณต้องการเรียกใช้จากบรรทัดคำสั่งด้วยตัวคุณเอง (ตัวอย่างเช่น: ทดสอบก่อนที่จะวางลงในไฟล์แบทช์) จากนั้นคุณใช้% เดียว
Brent Rittenhouse

19

หากต้องการอ่านไฟล์ ...

set /P Variable=<File.txt

เพื่อเขียนไฟล์

@echo %DataToWrite%>File.txt

บันทึก; การมีช่องว่างก่อนอักขระ <> ทำให้ช่องว่างถูกเพิ่มในตอนท้ายของตัวแปรเช่นกัน

หากต้องการเพิ่มลงในไฟล์เช่นโปรแกรมตัวบันทึกอันดับแรกให้สร้างไฟล์ที่มีคีย์ Enter ตัวเดียวในนั้นเรียกว่า e.txt

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

บันทึกของคุณจะมีลักษณะเช่นนี้

Entry1
Entry2 

และอื่น ๆ

อย่างไรก็ตามสิ่งที่มีประโยชน์คู่


ขอบคุณสำหรับคำตอบ. BTW "set / P Variable = <File.txt" อ่านเฉพาะไฟล์บรรทัดแรก
Deepscorn

19

คำตอบเหล่านี้ล้วนใกล้กับคำตอบที่ฉันต้องการ นี่คือความพยายามที่จะขยายพวกเขา

ในไฟล์แบตช์

หากคุณกำลังเรียกใช้จากภายใน.batไฟล์และคุณต้องการบรรทัดเดียวที่ช่วยให้คุณสามารถส่งออกคำสั่งที่ซับซ้อนเช่นjq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.jsonตัวแปรชื่อAWS_ACCESS_KEYแล้วคุณต้องการสิ่งนี้:

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

บนบรรทัดคำสั่ง

หากคุณC:\พรอมต์คุณต้องการบรรทัดเดียวที่ให้คุณเรียกใช้คำสั่งที่ซับซ้อนเหมือนกับjq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.jsonตัวแปรที่มีชื่อAWS_ACCESS_KEYคุณต้องการสิ่งนี้

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

คำอธิบาย

ข้อแตกต่างระหว่างสองคำตอบข้างต้นคือในบรรทัดคำสั่งคุณใช้% เดียวในตัวแปรของคุณ ในแฟ้มแบตช์คุณต้องเพิ่มเครื่องหมายเปอร์เซ็นต์ (%%) เป็นสองเท่า

เนื่องจากคำสั่งรวมถึงเครื่องหมายจุดคู่คำพูดและวงเล็บคุณต้องรวมUSEBACKQบรรทัดไว้ในตัวเลือกเพื่อให้คุณสามารถใช้ backquotes เพื่อระบุคำสั่งให้เรียกใช้แล้วตัวละครตลกทุกชนิดที่อยู่ในนั้น


13

หากคุณไม่ต้องการที่จะส่งออกไปยังไฟล์ temp แล้วอ่านเป็นตัวแปรรหัสนี้เก็บผลของคำสั่งโดยตรงเป็นตัวแปร:

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

หากคุณต้องการใส่สตริงการค้นหาด้วยเครื่องหมายคำพูดคู่:

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

หากคุณต้องการเก็บรหัสนี้ในไฟล์แบตช์ให้เพิ่มสัญลักษณ์% พิเศษ:

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

ตัวอย่างที่มีประโยชน์ในการนับจำนวนไฟล์ในไดเรกทอรี & store ในตัวแปร: (แสดงภาพของ piping)

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

หมายเหตุการใช้ราคาเดียวแทนคำพูดคู่ "หรือสำเนียงหลุมฝังศพ` ในวงเล็บคำสั่ง. นี้เป็นทางเลือกที่สะอาดdelims, tokensหรือusebackqในforวง

ทดสอบกับ Win 10 CMD


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

ฉันไม่เห็นว่าวิธีนี้แก้ปัญหาได้อย่างไร appcmdไม่ใช่โปรแกรมมาตรฐานและฉันไม่สามารถเห็นตำแหน่งที่คุณกำหนดเอาต์พุตของโปรแกรมให้กับตัวแปรได้ ในที่สุดคุณต้องมีคำอธิบายเพิ่มเติม
2560

-3

ฉันได้ทดสอบมันเช่นนี้แล้วมันใช้งานได้:

SET /P Var= | Cmd

โดยการไพพ์คำสั่งลงในตัวแปรพรอมต์จะแทรกผลลัพธ์ของคำสั่ง " Cmd" ลงในตัวแปร " Var"

ปรับปรุง:

มันใช้งานไม่ได้เลวร้ายสคริปต์ที่ฉันทำคือ:

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

มันเป็นจริงแสดงสมมติว่า " test.txt" แต่ในความเป็นจริงการแสดงผลของ " dir /b *.txtคำสั่ง" echo %var%ไม่ได้ ฉันสับสนเพราะผลลัพธ์ทั้งสองเหมือนกัน


3
หากคุณตั้งใจจะทำpipe the command into a variable promptคุณควรเขียนมันdir /b *.txt | SET /P Var=เพื่อให้ทิศทางของท่อถูกต้อง PS: มันก็ไม่ทำงานเช่นนั้น!
Jesse Chisholm

-18

หวังว่าความช่วยเหลือนี้

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

5
ไม่สิ่งนี้ไม่ตอบคำถามคำถามกำลังจะได้ผลลัพธ์ของคำสั่งไปยังตัวแปร
jeb

วิธีที่ง่ายคือเขียนไปยังไฟล์และอ่านจากไฟล์นั้น findstr "test" test.txt> testoutput.txt set /pa=<testoutput.txt echo% a%
Ben2014
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.