จะอ่านเนื้อหาของไฟล์เป็นตัวแปรในแบตช์ไฟล์ได้อย่างไร?


161

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

"C:\Program Files\Windows Resource Kits\Tools\robocopy.exe" "\\testserver\testapp$"        
"\\liveserver\liveapp$" *.* /E /XA:H /PURGE /XO /XD ".svn" /NDL /NC /NS /NP
del "\\liveserver\liveapp$\web.config"
ren "\\liveserver\liveapp$\web.live.config" web.config

ดังนั้นฉันมีคำถามสองสามข้อเกี่ยวกับวิธีการบรรลุเป้าหมาย ...

  1. มีversion.txtไฟล์อยู่ใน\\testserver\testapp$โฟลเดอร์และเนื้อหาเดียวของไฟล์นี้คือหมายเลขบิลด์ (เช่น 45 - สำหรับบิลด์ 45) ฉันจะอ่านเนื้อหาของversion.txtไฟล์ลงในตัวแปรในแบตช์ไฟล์ได้อย่างไร

  2. ฉันจะตรวจสอบว่ามีไฟล์\\fileserver\myapp\releasedocs\ {build}.docอยู่โดยใช้ตัวแปรจากส่วนที่ 1 แทนที่ {build} ได้อย่างไร

คำตอบ:


300

อ่านเนื้อหาของไฟล์ลงในตัวแปร:

for /f "delims=" %%x in (version.txt) do set Build=%%x

หรือ

set /p Build=<version.txt

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

การใช้ตัวแปร - เช่นเดียวกับตัวแปรสภาพแวดล้อมอื่น ๆ - เป็นหนึ่งหลังจากทั้งหมด:

%Build%

ดังนั้นเพื่อตรวจสอบการมีอยู่:

if exist \\fileserver\myapp\releasedocs\%Build%.doc ...

แม้ว่ามันอาจเป็นไปได้ว่าไม่มีเส้นทางของ UNC ที่ได้รับอนุญาต ไม่สามารถทดสอบได้ในขณะนี้ แต่โปรดจำไว้


4
setวิธีเดียวที่อ่านเกี่ยวกับ 1024 อักขระทำไมว่าคืออะไร?
Iulian Onofrei

12
อาจเป็นเพราะข้อ จำกัด cmdของบัฟเฟอร์ภายใน มันเป็นภาษาที่น่ากลัวสำหรับสคริปต์ที่เชื่อถือได้
Joey

ฉันรู้ว่าฉันพยายามหลายชั่วโมงเพื่อแทนที่สตริงในไฟล์: |
Iulian Onofrei

16
@IulianOnofrei set /pเรียกcmd!ReadBufFromInputใช้บัฟเฟอร์ที่จัดสรรสแต็กเพื่ออ่านอักขระที่มีความกว้าง 1,023 ตัว (2046 ไบต์) มันอ่าน 1,023 ไบต์จากไฟล์สมมติว่า 1 ไบต์ต่อตัวอักษร OEM / ANSI แต่มันถอดรหัสไฟล์โดยใช้เพจรหัสปัจจุบันซึ่งไม่จำเป็นต้องเป็น OEM / ANSI กรณีที่เลวร้ายที่สุดคือเพจรหัส 65001 และไฟล์ที่เต็มไปด้วยอักขระ UTF-8 ขนาด 4 ไบต์ (เช่นสคริปต์โบราณ) คุณจะได้รับ 255 อักขระรวมถึงอักขระที่ถอดรหัสบางส่วนที่เก็บไว้เป็นอักขระทดแทน U + FFFD
Eryk Sun

3
for /f "usebackq" %%x in ("path with spaces.txt") ...@Jan: help forกล่าวถึงเรื่องนี้โดยวิธีการ
Joey

46

คุณสามารถอ่านตัวแปรหลายตัวจากไฟล์ดังนี้:

for /f "delims== tokens=1,2" %%G in (param.txt) do set %%G=%%H

โดยที่ param.txt:

PARAM1=value1
PARAM2=value2
...

1
นี่คือทางออกที่สมบูรณ์แบบ เพื่อตอบคำถาม OP อย่างแท้จริง(param.txt)ควรจะเป็น(version.txt)และควรมีBuild=45
robotik

นี่คือวิธีการแก้ปัญหา
JAIL

3
%% G ไม่คาดคิดในขณะนี้
จอห์น

4
@John: สำหรับการใช้งานโดยตรงบนบรรทัดคำสั่งให้แทนที่%%Gด้วย%G
Stephan

32

แค่ทำ:

type version.txt

และจะปรากฏเป็นถ้าคุณพิมพ์:

set /p Build=<version.txt
echo %Build%

4
@jeb ฉันรู้ว่า แต่ im ยังคงรู้สึกขอบคุณสำหรับคำสั่งประเภทเพราะ thats สิ่งที่ฉันต้องการ
ชายรักชาย

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

22

ในการรับบรรทัดทั้งหมดของไฟล์ที่โหลดลงในตัวแปรจำเป็นต้องมีการขยายที่ล่าช้าดังนั้นให้ทำดังนี้:

SETLOCAL EnableDelayedExpansion

for /f "Tokens=* Delims=" %%x in (version.txt) do set Build=!Build!%%x

มีปัญหาเกี่ยวกับตัวอักษรพิเศษบางอย่างแม้ว่าโดยเฉพาะอย่างยิ่ง;, %และ!


ล้อมรอบทั้งsetการแสดงออกภายในราคาสองครั้งสามารถหลีกเลี่ยงปัญหาที่มีอย่างน้อยบางset "Build=!Build!%%x"ตัวอักษรพิเศษ:
aschipfl

9
สคริปต์ของฉันพิมพ์ "echo is ON" เหตุใดจึงเป็นชุดขยะสมบูรณ์
เทรเวอร์ Hickey

ใช้งานได้สำหรับฉันโดยไม่มีการขยายเวลาล่าช้า: set err=(บรรทัดถัดไป)for /f "delims=" %%x in (err.tmp) do set "err=%err% %%x"
tivnet

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