Batch File ที่คัดลอก 2 บรรทัดแรกของไฟล์ข้อความไปยังไฟล์ข้อความอื่น


4

ฉันมีไฟล์ข้อความ A.txt

Pinging [xx.xx.xx.xx] with 32 bytes of data:

Request timed out.

Ping statistics for xx.xx.xx.xx:
Packets: Sent = 1, Received = 0, Lost = 1 (100% loss)

ฉันต้องการคัดลอก 2 บรรทัดแรกของไฟล์นี้ไปยังไฟล์ B.txt อื่นเช่น

Pinging [xx.xx.xx.xx] with 32 bytes of data:
Request timed out.

ฉันรู้ว่าฉันสามารถใช้ FOR / F เพื่อวนซ้ำบรรทัดต่างๆในไฟล์ได้ ฉันรู้วิธีที่จะข้ามสองบรรทัดแรก แต่ไม่เพียงอ่านพวกเขาเท่านั้น ฉันยังพยายามทำโดยใช้ FOR / F กับคำสั่ง DO ECHO และคำสั่ง FIND ที่เกี่ยวข้องและคำสั่ง FINDSTR แบบตรง (ทั้งสองกรณีค้นหาคำว่า "Pinging" และ "Request") แต่ฉันไม่สามารถทำงานได้อย่างถูกต้อง


คุณสามารถใช้ gnuwin32 คำสั่ง head, พิมพ์ file.a | head -n 2 แต่นั่นเป็นคำสั่ง * nix แต่มันน่าสนใจที่จะรู้ว่ามันสามารถทำได้ในแบทช์ / windows
barlop

คำตอบ:


6

ฉันโพสต์รหัสทั้งหมดด้านล่าง แต่เนื้อจริงอยู่ที่นี่:

:: set counter
set c=0
for /f "delims=|" %%i in (%1) do (
:: increment counter for each line read
  set /a c=!c!+1
  if !c! leq %3 echo %%i >> %2
)

โดยทั่วไปคุณตั้งค่าตัวแปรตัวนับ c เป็น 0 จากนั้นเพิ่มขึ้นสำหรับแต่ละบรรทัดที่อ่านจากไฟล์ข้อความ คุณทดสอบตัวนับกับบรรทัดสูงสุดและ echo ไปยังแฟ้มผลลัพธ์ถ้ามันน้อยกว่าหรือเท่ากับ

"delims=|"พารามิเตอร์ในการห่วงช่วยให้มันจากการทำลายเส้นเข้าไปในราชสกุลที่อักขระช่องว่างและทำให้การแสดงผลเพียงเส้นบางส่วน !c!ตัวแปรที่ผิดปกติคือวิธีการอ้างอิงตัวแปรที่ใช้การขยายตัวล่าช้า หากคุณเพิ่งใช้%c%ค่าจะไม่เปลี่ยนแปลงภายในforลูป

คุณจัดเตรียมสคริปต์ด้วยพารามิเตอร์สามตัว ได้แก่ ไฟล์อินพุตไฟล์เอาต์พุตและ # ของบรรทัดที่ส่งออก % 1,% 2 และ% 3 แสดงถึงพารามิเตอร์อินพุตแต่ละตัวในสคริปต์

 @echo off

REM ======================================================================
REM
REM NAME: 
REM
REM AUTHOR: Scott McKinney
REM DATE  : 
REM
REM PURPOSE: 
REM COMMENT: 
REM DEPENDENCIES:
REM
REM Revisions:
REM
REM ======================================================================

setlocal ENABLEEXTENSIONS
setlocal ENABLEDELAYEDEXPANSION

set a=%1
if "%1"=="" goto HELP
if "%a:~0,2%"=="/?" goto HELP
if "%a:~0,2%"=="-?" goto HELP
if "%a:~0,2%"=="/h" goto HELP
if "%a:~0,2%"=="/H" goto HELP
if "%a:~0,2%"=="-h" goto HELP
if "%a:~0,2%"=="-H" goto HELP
if "%a:~0,3%"=="--h" goto HELP
if "%a:~0,3%"=="--H" goto HELP

:: set counter
set c=0
for /f "delims=|" %%i in (%1) do (
:: increment counter for each line read
  set /a c=!c!+1
  if !c! leq %3 echo %%i >> %2
)
goto END

:HELP
echo.
echo Usage: %0 ^<input file^> ^<output file^> ^<n lines^>
echo.
echo. Outputs the first ^<n^> lines from ^<input file^> to ^<output file^>.
echo.
:END

หมายเหตุสำหรับการอ้างอิงในอนาคตเท่านั้น แต่หากคุณเปิดใช้งานส่วนขยายคำสั่ง ( setlocal enableextensions) คุณสามารถใช้if /iเพื่อจับคู่แบบตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ นั่นจะตัดโค้ดสองสามบรรทัดให้คุณและทำให้การบำรุงรักษาง่ายขึ้น
เบคอน Bits

@Bacon Bits ฉันต้องการเพิ่มสิ่งที่คุณพูดส่วนขยาย cmd ถูกเปิดใช้งานตามค่าเริ่มต้น btw การขยายตัวล่าช้าไม่ใช่ ..
barlop

+1 ฉันได้ทดสอบคำตอบนี้และดูเหมือนว่าจะใช้งานได้และฉันเห็นตรรกะของมัน
barlop

ขอบคุณสก็อต กล้าถามว่า "การขยายล่าช้า" คืออะไร?
เซาท์แคโรไลนา

1
โดยปกติเมื่อใช้ตัวแปรสภาพแวดล้อมในไฟล์แบตช์ค่าจะถูกขยายหนึ่งครั้งก่อนดำเนินการ ไม่มีการตรวจสอบในภายหลังเพื่อดูว่ามีการเปลี่ยนแปลงทุกครั้งที่มีการเรียกหรือไม่ โดยเฉพาะกับลูปคุณสามารถพบปัญหากับตัวแปรที่ไม่เปลี่ยนแปลง การขยายที่ล่าช้า ( setlocal enabledelayedexpansion) ช่วยให้คุณบอกระบบให้รอเพื่อขยายตัวแปร คุณสามารถระบุตัวแปรล่าช้ากับ!แทน%เพื่อที่คุณจะพูดแทน!variable! %variable%ดูและsetlocal /? set /?พวกมันใช้เทคนิคในการประมวลผลช้าลง แต่ฉันไม่เคยสังเกต
เบคอนบิตส์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.