CMD รับสตริงจากไฟล์และตั้งค่าเป็นตัวแปรเพื่อใช้ในซีดี

ฉันยังใหม่กับไฟล์แบตช์และฉันกำลังพยายามเขียนไฟล์หนึ่งเพื่อทำงานส่วนหนึ่งของฉัน (ฉันรู้ดีว่าขี้เกียจ)

จนถึงตอนนี้ฉันมีดังต่อไปนี้ ...

SET skip=1

REM for all the directories indicated to contain core repositories
FOR /F "skip=%skip% delims=" %%i IN (C:\Repos.txt) DO ( 
SET TgtDir =%%i
echo %TgtDir% >> C:\result.txt
)

เนื้อหาของ Repos.txt คือ:

60000
C:\somedir\someotherdir\
C:\a\b\c\

โดยพื้นฐานแล้วฉันต้องการให้สคริปต์นี้ผ่านไฟล์โดยไม่สนใจบรรทัดแรกที่จะใช้สำหรับการตั้งค่าการหน่วงเวลาในภายหลัง และแยกแต่ละบรรทัดจากนั้น (ตามหลักการ) ส่งต่อไปยังคำสั่ง cd แต่ตอนนี้ฉันแค่พยายามทำให้ได้ ลงในตัวแปร TgtDir

เมื่อฉันรันสคริปต์นี้ ผลลัพธ์ใน C:\result.txt คือ:

ECHO is on.
ECHO is on.

ความช่วยเหลือใด ๆ ?


person Richard Newman    schedule 20.09.2012    source แหล่งที่มา
comment
SET TgtDir =%%i ตั้งค่าตัวแปรชื่อ TgtDir - สังเกตช่องว่างเพิ่มเติม ดังนั้น %TgtDir% จะไม่ส่งคืนสิ่งใดเลยเนื่องจากไม่มีอะไรเรียกว่าสิ่งนั้น   -  person SeanC    schedule 20.09.2012


คำตอบ (2)


คุณจะต้องดูตัวเลือก EnableDelayedExpansion สำหรับไฟล์แบตช์ จากลิงค์ข้างต้น:

การขยายตัวแปรแบบหน่วงเวลามักจะมีประโยชน์เมื่อทำงานกับ FOR Loop โดยปกติแล้ว FOR loop ทั้งหมดจะถูกประเมินเป็นคำสั่งเดียว แม้ว่าจะครอบคลุมหลายบรรทัดของสคริปต์ชุดงานก็ตาม

ดังนั้นสคริปต์ของคุณจะมีลักษณะดังนี้:

@echo off
setlocal enabledelayedexpansion
SET skip=1

REM for all the directories indicated to contain core repositories
FOR /F "skip=%skip% delims=" %%i IN (C:\Repos.txt) DO (
    SET TgtDir=%%i
    echo !TgtDir! >> C:\result.txt
)

อีกทางเลือกหนึ่ง เพียงใช้ตัวแปร %%i ในลูปภายในของคุณ แทนที่จะสร้างตัวแปรใหม่

person Jonah Bishop    schedule 20.09.2012
comment
วิธีนี้ช่วยแก้ไขปัญหาของฉันได้เช่นกัน ในกรณีของฉัน สคริปต์จะล้มเหลวเสมอในครั้งแรกที่เรียกใช้งานใน cmd.exe ใหม่ การรันสองครั้งใน cmd.exe เดียวกันจะได้ผล ขอบคุณสำหรับคำแนะนำนี้ :) - person Qben; 05.10.2012

person    schedule
comment
หากไม่มีการจัดรูปแบบนี่เป็นเรื่องยากมากที่จะเข้าใจ - person Andrew; 01.05.2014