เกิดข้อผิดพลาดในการอ่านค่าจากไฟล์แบตช์และพิมพ์


7

ฉันพยายามอ่านจากไฟล์และพิมพ์ค่า แต่ไม่ได้ผลดูเหมือนว่าตัวแปรจะถูกตั้งค่าด้วยการใช้งานครั้งล่าสุด

read.bat:

@echo off
for /f "tokens=*" %%a in (data.bat) do (
echo %%a
set server=%%a
echo %server%
)
pause

data.bat:

 1
 2
 3
 4

เอาท์พุท:

 1
 4
 2
 4
 3
 4
 4
 4 

ผลลัพธ์ที่คาดหวัง:

1
1
2
2
3
3
4
4

คำตอบ:


8

ดูเหมือนว่าตัวแปรจะถูกตั้งค่าด้วยการรันครั้งสุดท้าย

นี่เป็นเพราะวิธีcmdแยกวิเคราะห์ไฟล์แบตช์ โดยค่าเริ่มต้นตัวแปรจะถูกขยายเวลาการแยกวิเคราะห์ไม่ใช่เวลารัน ซึ่งหมายความว่าตัวแปรในลูปจะได้รับการประเมินอย่างไม่ถูกต้องยกเว้นว่าคุณเปิดใช้งานการขยายที่ล่าช้า :

setlocal enabledelayedexpansion

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

เมื่อการขยายที่ล่าช้าอยู่ในตัวแปรผลสามารถอ้างอิงได้โดยใช้!variable_name!(นอกเหนือจากปกติ%variable_name%)

การขยายตัวล่าช้าที่มา

ใช้ไฟล์แบตช์ต่อไปนี้

test.cmd:

@echo off
setlocal enabledelayedexpansion
for /f "tokens=*" %%a in (data.bat) do (
echo %%a
set server=%%a
echo !server!
)
pause
endlocal

ตัวอย่างผลลัพธ์:

F:\test>test
1
1
2
2
3
3
4
4
Press any key to continue . . .

อ่านเพิ่มเติม

  • ดัชนี AZ ของบรรทัดคำสั่ง Windows CMD - การอ้างอิงที่ยอดเยี่ยมสำหรับทุกสิ่งที่เกี่ยวข้องกับบรรทัด Windows cmd
  • เปิดใช้งานการขยายเวลาล่าช้า - การขยายที่ล่าช้าจะทำให้ตัวแปรขยายตัวในเวลาดำเนินการแทนการแจงเวลา
  • setlocal - ตั้งค่าตัวเลือกเพื่อควบคุมการมองเห็นตัวแปรสภาพแวดล้อมในไฟล์แบตช์

2

ให้ช็อตนี้แทนการใช้ CALL เพื่อรูทีนย่อยที่ส่งค่า FOR วนซ้ำจากไฟล์ data.bat ไปยังรูทีนนั้นเป็นอาร์กิวเมนต์ไปยัง ECHO เป็นต้น:

@echo off
for /f "tokens=*" %%a in (data.bat) do (
CALL :Routine "%%~a"

)
PAUSE
GOTO EOF

:Routine
echo %~1
set server=%~1
echo %server%
GOTO EOF

แหล่งข้อมูลเพิ่มเติม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.