1. 程式人生 > >bat應用----刪除前三行、合併檔案

bat應用----刪除前三行、合併檔案

我有兩個資料夾Types和TypeBodies,裡面有同名的檔案(字尾不同),否則只在Types裡面。我需要刪除每個檔案裡面前三行註釋的內容,然後把TypeBodies的檔案內容放到Types裡的同名檔案後。

  • 刪除所有檔案的前三行
@echo off&setlocal enabledelayedexpansion
rem 刪除Types、TypeBodies資料夾裡的前三行
rem 遍歷TypeBodies中的所有檔案
for /r .\TypeBodies %%i in (*) do (
    echo %%i
    rem 按行讀取檔案內容,跳過前三行;'findstr .* %%i'查詢檔案所有內容,包括空格和空行
    for /f "skip=3 delims=" %%j in ('findstr .* %%i') do (
        rem 按行寫到$
        echo;%%j>>$
    )
    rem 把$中內容寫到原檔案
    move $ %%i
)
pause
  • 合併同名檔案
@echo off&setlocal enabledelayedexpansion
rem 把TypeBodies裡的檔案複製到Type的同名檔案後邊
rem 遍歷Types裡的檔案
for /r .\Types %%i in (*) do (
    echo %%~ni
    rem 如果TypeBodies裡存在同名檔案,合併兩個檔案,並放到Types資料夾
    if exist .\TypeBodies\%%~ni.tpb copy /b %%i+.\TypeBodies\%%~ni.tpb %%i
)
pause

下面說說我對其中命令的理解:
echo off關閉屏顯,就是下面的指令不會在螢幕上打出來,前邊加個@,echo off也不會顯示;&表示命令都執行,前邊執行失敗,後邊不執行;
setlocal enabledelayedexpansion表示變數延遲,下面的for迴圈會用到,使得每次迴圈%%i的值不一樣;
for %%i in (1) do (2)是bat中的for迴圈,%%i是迴圈變數,(1)是需要迴圈的集合,(2)是每次迴圈需要執行的語句塊,/r表示遞迴遍歷,.表示當前目錄,後邊的反斜槓是資料夾分隔符,切記只能用反斜槓;
echo列印後邊內容到螢幕;rem表示註釋,後邊的內容不執行;
下邊一個for迴圈按行遍歷檔案內容,/f表示讀取檔案內容,skip=3表示跳過前三行,delims=表示分隔符為空,findstr表示查詢字串,.*表示任意字元重複任意遍,用這種方法能查詢檔案內所有字元,包括空格和空行;echo;表示忽略輸出到螢幕,>>表示輸出,\(只是一個變數; move 表示移動內容到\)

;pause是暫停,螢幕顯示輸入任意字元以繼續
%%~ni表示%%i中檔名(沒有路徑,沒有後綴),後邊加.tpb表示字元拼接;
copy 把前邊內容複製到後邊檔案,+表示兩個檔案拼接,/b表示是二進位制檔案,此處避免生成的檔案後邊有特殊字元