เป็นไปได้หรือไม่ที่จะตั้งค่าเอาต์พุตของชุดคำสั่งของแบตช์ไฟล์เป็นตัวแปรตัวอย่างเช่น:
findstr testing > %VARIABLE%
echo %VARIABLE%
เป็นไปได้หรือไม่ที่จะตั้งค่าเอาต์พุตของชุดคำสั่งของแบตช์ไฟล์เป็นตัวแปรตัวอย่างเช่น:
findstr testing > %VARIABLE%
echo %VARIABLE%
คำตอบ:
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
ENABLEDELAYEDEXPANSION
|
ในกรณีที่มันไม่ทำงาน
command
แต่อย่างใด ฉันแน่ใจว่ามันส่งคืนรหัสที่ไม่ใช่ศูนย์ แต่%ERRORLEVEL%
มี 0 เสมอไม่ว่าฉันจะพยายามใช้งานที่ไหน (แม้อยู่ในdo
บล็อก) ดังนั้นฉันคิดว่าบางส่วนของfor
โครงสร้างนั้นเขียนทับมัน BTW มันไม่น่าเชื่อว่ารหัสที่ดูบ้าเป็นสิ่งจำเป็นสำหรับบางสิ่งบางอย่างในระดับประถมศึกษา
ฉันพบกระทู้นี้ว่ามีสิ่ง 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
เพิ่มเครดิตให้กับฮาร์ดแวร์ของทอม
ในบรรทัดเดียว:
FOR /F "tokens=*" %g IN ('*your command*') do (SET VAR=%g)
เอาต์พุตคำสั่งจะถูกตั้งค่าเป็น% g จากนั้นใน VAR
ข้อมูลเพิ่มเติม: https://ss64.com/nt/for_cmd.html
หากต้องการอ่านไฟล์ ...
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
และอื่น ๆ
อย่างไรก็ตามสิ่งที่มีประโยชน์คู่
คำตอบเหล่านี้ล้วนใกล้กับคำตอบที่ฉันต้องการ นี่คือความพยายามที่จะขยายพวกเขา
หากคุณกำลังเรียกใช้จากภายใน.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 เพื่อระบุคำสั่งให้เรียกใช้แล้วตัวละครตลกทุกชนิดที่อยู่ในนั้น
หากคุณไม่ต้องการที่จะส่งออกไปยังไฟล์ 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
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
ไม่ใช่โปรแกรมมาตรฐานและฉันไม่สามารถเห็นตำแหน่งที่คุณกำหนดเอาต์พุตของโปรแกรมให้กับตัวแปรได้ ในที่สุดคุณต้องมีคำอธิบายเพิ่มเติม
ฉันได้ทดสอบมันเช่นนี้แล้วมันใช้งานได้:
SET /P Var= | Cmd
โดยการไพพ์คำสั่งลงในตัวแปรพรอมต์จะแทรกผลลัพธ์ของคำสั่ง " Cmd
" ลงในตัวแปร " Var
"
ปรับปรุง:
มันใช้งานไม่ได้เลวร้ายสคริปต์ที่ฉันทำคือ:
SET /P Var= | dir /b *.txt
echo %Var%
มันเป็นจริงแสดงสมมติว่า " test.txt
" แต่ในความเป็นจริงการแสดงผลของ " dir /b *.txt
คำสั่ง" echo %var%
ไม่ได้ ฉันสับสนเพราะผลลัพธ์ทั้งสองเหมือนกัน
pipe the command into a variable prompt
คุณควรเขียนมันdir /b *.txt | SET /P Var=
เพื่อให้ทิศทางของท่อถูกต้อง PS: มันก็ไม่ทำงานเช่นนั้น!