วิธีการแยกไฟล์ข้อความเดียวเป็นไฟล์ข้อความหลายไฟล์โดยบรรทัดโดยใช้แบทช์?


1

ฉันใช้งานโปรแกรมต่อไปนี้

@echo off
cls
set /p "filename=type file name>"
setlocal enabledelayedexpansion
for /r E:\ %%a in (*) do if "%%~nxa"=="%filename%" (
echo %%~dpnxa >>path.txt
)

ฉันมีไฟล์เอาต์พุตpath.txtที่มี

E:\new.txt 
E:\Redmi\new folder\new.txt
E:\windows\new folder\new folder\new.txt

ฉันชอบที่จะมีไฟล์แยกกันเช่น

E:\new.txt ใน path1.txt

E:\Redmi\new folder\new.txt ใน path2.txt

E:\windows\new folder\new folder\new.txt ใน path3.txt


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

คำตอบ:


1

ฉันจะแยกไฟล์ข้อความเดียวเป็นไฟล์ข้อความหลายบรรทัดโดยบรรทัดได้อย่างไร

เมื่อสร้างความคิดเห็นโดยSethคุณสามารถใช้ไฟล์แบตช์ต่อไปนี้:

@echo off
cls
setlocal enabledelayedexpansion
set /p "filename=type file name>"
rem initialise counter to 1
set _count=1
for /r E:\ %%a in (*) do if "%%~nxa"=="%filename%" (
  echo %%~dpnxa >>path!_count!.txt
  rem increment the counter
  set /a _count+=1
  )
endlocal

หมายเหตุ:

  • ฉันได้ย้ายsetlocalสายเพื่อหยุดการfilenameรั่วไหลของตัวแปรในcmdเปลือกเรียก

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

  • ดัชนี AZ ของบรรทัดคำสั่ง Windows CMD
  • รายการหมวดหมู่ของคำสั่ง Windows CMD
  • เปิดใช้งานการขยายเวลาล่าช้า - การขยายที่ล่าช้าจะทำให้ตัวแปรขยายตัวในเวลาดำเนินการแทนการแจงเวลา
  • endlocal - สิ้นสุดการแปลของการเปลี่ยนแปลงสภาพแวดล้อมในแบตช์ไฟล์ ส่งผ่านตัวแปรจากชุดไฟล์หนึ่งไปยังอีกชุดหนึ่ง
  • for / r - วนรอบไฟล์ (เรียกคืนโฟลเดอร์ย่อย)
  • set - แสดงตั้งค่าหรือลบตัวแปรสภาพแวดล้อม CMD การเปลี่ยนแปลงที่ทำกับ SET จะยังคงอยู่เฉพาะช่วงเวลาของเซสชัน CMD ปัจจุบัน
  • setlocal - ตั้งค่าตัวเลือกเพื่อควบคุมการมองเห็นตัวแปรสภาพแวดล้อมในไฟล์แบตช์

1
ตามที่เขียนไว้สิ่งนี้จะล้มเหลวหากส่วนใดส่วนหนึ่งของเส้นทางผลลัพธ์มีเครื่องหมายอัศเจรีย์ วิธีการแก้ปัญหาต้องสลับการเปิดและปิดการขยายล่าช้าในวง แต่ฉันชอบใช้ FINDSTR / N ควบคู่กับ FOR / F เพื่อรับหมายเลขบรรทัดโดยไม่จำเป็นต้องขยายเวลาล่าช้า (ดูคำตอบของฉัน )
dbenham

1

ฉันมีวิธีที่ง่ายกว่าและอาจเร็วกว่าสำหรับคุณ:

  • ใช้DIR /S /B /A-DแทนFOR /Rเพื่อรับรายการพา ธ สิ่งนี้ไม่จำเป็นต้องมีIFคำสั่ง
  • ไพพ์ไปที่การFINDSTR /Nจับคู่ที่จุดเริ่มต้นของบรรทัดเพื่อรับหมายเลขบรรทัดสำหรับใช้ในชื่อไฟล์เอาต์พุต
  • ดำเนินการทุกอย่างภายในFOR /Fเพื่อย้ำและแยกผลลัพธ์เป็นหมายเลขบรรทัดและเส้นทางของแต่ละบรรทัด
@echo off
setlocal
set /p "filename=type file name>"
for /f "delims=: tokens=1*" %%A in (
  'dir /s /b /a-d "E:\%filename%" ^| findstr /n "^"'
) do >"path%%A.txt" echo %%B

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

@echo off
for /f "delims=: tokens=1*" %%A in (
  'dir /s /b /a-d "E:\%~1" ^| findstr /n "^"'
) do >"path%%A.txt" echo %%B
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.