Batch script เพื่อรวมไฟล์โดยใช้คำสั่ง copy ตามลำดับตัวเลข


-1

จะขอบคุณถ้าใครสามารถช่วยฉันด้วยการร้องขอนี้

ฉันต้องการสคริปต์ชุดแบบไดนามิกซึ่งสามารถทำคำสั่งด้านล่างสำหรับจำนวนไฟล์ใด ๆ :

Copy 1.txt + 2.txt + 3.txt + 4.txt newfile.txt

หากฉันมีไฟล์ต่อไปนี้:

1.txt

2.txt

3.txt

... เป็นต้น

และฉันลอง: Copy *.txt newfile.txt มันไม่เรียงลำดับอย่างถูกต้องเมื่อรวม จริง ๆ แล้วมันทำเช่นนี้:Copy 3.txt + 4.txt + 2.txt + 1.txt newfile.txt

นอกจากนี้ฉันต้องการใช้คำสั่งcopyและไม่ใช่คำสั่ง type

ฉันไม่สามารถหาวิธีที่เหมาะสมในการทำสิ่งนี้ได้เนื่องจาก FOR ลูปตัวอย่างส่วนใหญ่ใช้ TYPE แบบออนไลน์และไม่เหมาะกับสิ่งที่ฉันพยายามจะทำ

ความช่วยเหลือของคุณได้รับการชื่นชมอย่างมาก!


ยินดีต้อนรับสู่ SuperUser ตาม [ในหัวข้อ] คำถามของคุณอยู่ในstackoverflow.comแทน อย่างไรก็ตามนี่เป็นCopy *.txt newfile.txtคำสั่งที่แปลก: ผสานไฟล์ตามลำดับตัวอักษรใน Windows 8 ของฉันโดยแสดงรายการไฟล์ที่คัดลอกdir /B /O:N *.txtมา โปรดแก้ไขคำถามของคุณและแบ่งปันตัวอย่างที่น้อยที่สุดสมบูรณ์และตรวจสอบได้
JosefZ

ขอบคุณสำหรับการตอบกลับอย่างรวดเร็วและขอโทษที่โพสต์ที่นี่ :) อัปเดตคำถามแล้ว
binaryfinary

ฉันยังสงสัยว่าทำไมไฟล์ของคุณไม่ถูกคัดลอกตามลำดับ เป็นไปได้ว่าคำสั่ง COPY กำลังติดตามการตั้งค่าการสั่งซื้อ DIR ในการทดสอบชุดว่าตัวแปรสภาพแวดล้อม DIRCMD set DIRCMD=/OGNการสั่งซื้อไฟล์ของคุณโดยใช้ชื่อ จากนั้นลองใช้คำสั่ง copy ของคุณ
ดี้บราวน์

คำตอบ:


1

ฉันไม่copyอยากจะเชื่อเลยว่าจะเปลี่ยนลำดับการจัดเรียงของไฟล์ที่ถูกผสาน อย่างไรก็ตามสคริปต์self_explainingถัดไปอาจช่วยได้:

@ECHO OFF
SETLOCAL EnableExtensions DisableDelayedExpansion

pushd d:\bat\files\folder

REM echo(&echo SHOW files to be merged in different sort order 
REM erase newfile.txt 2>NUL
REM @ECHO ON
REM @for %%G in (
REM   "/-C" "/O:N" "/O:S" "/O:E" "/O:D /T:C" "/O:D /T:W"
REM   ) do dir %%~G *.txt|findstr "\.txt$"
REM @ECHO OFF

echo(&echo RESULT: copy *.txt newfile.txt
erase newfile.txt 2>NUL
rem (optional): to throw away trailing `Ctrl+Z`, use `/B` switch as follows:
rem copy /Y *.txt newfile.txt /B  
@ECHO ON
copy /Y *.txt newfile.txt
findstr "^" *.txt
@ECHO OFF

echo(&echo(&echo RESULT: merge *.txt in defined order: change `/O` switch
echo(
type nul> newfile.txt
set /A "_files=0"
for /F "delims=" %%G in ('
  dir /B /O:N *.txt
  ') do @if not "%%G"=="newfile.txt" (
            echo(%%~G
            set /A "_files+=1"
            copy /Y newfile.txt + %%~G newfile.txt /B >NUL
        )
echo       %_files% file^(s^) merged.
rem (optional): to add trailing `Ctrl+Z`, remove `REM` in next line  
REM copy newfile.txt + NUL newfile.txt >NUL
@ECHO ON
findstr "^" *.txt
@ECHO OFF
popd

โปรดทราบว่าคำสั่งREMโค้ดต่อไปนี้ - ประกอบpushdจะแสดงไฟล์ที่จะผสานในการเรียงลำดับที่แตกต่างกันหากไม่ได้คอมเมนต์ ( REMลบออกทั้งหมด 7 ) ฉันเก็บไว้ที่นี่เพื่อวัตถุประสงค์ในการแก้ไขข้อบกพร่อง

ผลลัพธ์ :

==> D:\bat\SU\1002948.bat

RESULT: copy *.txt newfile.txt

==> copy /Y *.txt newfile.txt
1.txt
2.txt
3.txt
4.txt
        1 file(s) copied.

==> findstr "^" *.txt
1.txt:1111
2.txt:2
3.txt:333
4.txt:44
newfile.txt:1111
newfile.txt:2
newfile.txt:333
newfile.txt:44
newfile.txt:→

RESULT: merge *.txt in defined order: change `/O` switch

1.txt
2.txt
3.txt
4.txt
      4 file(s) merged.

==> findstr "^" *.txt
1.txt:1111
2.txt:2
3.txt:333
4.txt:44
newfile.txt:1111
newfile.txt:2
newfile.txt:333
newfile.txt:44

==>

ที่นี่ต่อท้ายชี้ไปทางขวาลูกศรสัญลักษณ์newfile.txtแทนEOF(จุดสิ้นสุดของแฟ้มฐานสิบหก0x1A) คือ+CtrlZ

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