set file=
set /p file= 請把要處理的文件拉到本窗口:
set "file=%file:"=%"
for %%i in ("%file%") do set "file=%%~fi"
echo.
set replaced=
set /p replaced= 請輸入即將被替換的內(nèi)容:
echo.
set all=
set /p all= 請輸入替換字符串:
cd.>"%file%_tmp.txt"
setlocal enabledelayedexpansion
for /f "tokens=1* delims=:" %%i in ('findstr /n .* "%file%"') do (
set str=%%j
if not "!str!"=="" set "str=!str:%replaced%=%all%!"
>>"%file%_tmp.txt" echo.!str!
)
copy "%file%" "%file%_bak.txt" >nul 2>nul
move "%file%_tmp.txt" "%file%"
start "" "%file%"
這個批處理實現(xiàn)對一個文件的字符串替換。它使用了很多技巧,且聽我慢慢道來:
首先,我覺得“set file=”這個是沒有必要的,像是對變量的聲明。第11行將雙引號去除,這是很有必要的,因為file變量將作為for命令中的fileset,否則運行時會解釋錯誤。13行,在echo后面加一個小點,這里實現(xiàn)一個空行顯示。19行創(chuàng)建一個空白的文本文件作為文件交換的臨時文件。這里cd命令后面又跟了一個小點,可以理解為這是切換到當(dāng)前目錄下,其實等于什么也沒做。'findstr /n .* "%file%"'使用正則表達式查找文件里的字符串,/n表示顯示行號, .*查找任意字符。命令執(zhí)行結(jié)果作為for命令的處理對象。變量描述“tokens=1* delims=:”表示將處理對象中的一行按冒號為分隔符分成兩塊,%i表示第一塊,其它部分由%j表示。這樣,22行中的str變量里存儲的將是沒有行號和冒號的查找結(jié)果。23和24號就對變量于進行了變量替換,并將結(jié)果追加到臨時文件中。26行的>nul 將結(jié)果重定向到空的設(shè)備當(dāng)中,2>nul表示將錯誤的輸出也重定向到空設(shè)備中,為的是不回顯任何結(jié)果。最后一行,打開文件。
這里重點說明一下 2>nul :2在這里是句柄描述符,表示數(shù)據(jù)流輸入輸出的地址。
句柄 | 句柄的數(shù)字代號 | 說明
STDIN 0 鍵盤輸入
STDOUT 1 輸出到命令提示符窗口
STDERR 2 錯誤輸出到命令提示符窗口
這是我們常用到的句柄。
這個批處理以交互的方式提供對文件里的字符串進行替換,稍加修改就可以適應(yīng)于處理大批量的文件。
have fun!
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。