2012-03-20 44 views
0

如何更改下面的腳本來編輯原始文件而不是生成新文件?另外,如何讓該腳本在同一目錄中的所有.html文件上執行,而不必一次指定一個文件。批量重寫原始文件

@echo off 
setlocal EnableDelayedExpansion 
call :processFile <template.html> final.html 
goto :EOF 

:processFile 
    set line=EOF 
    set /P line= 
    if "!line!" == "EOF" goto :EOF 
    set X= 
    set "lineNoGen=!line:Gen_1_=$!" 
    if "!lineNoGen!" neq "!line!" (
     for /F "tokens=1-3 delims=$" %%a in ("!lineNoGen:Gen.1.=$!") do (
     set "beforeGen=%%a" 
     set "betweenGens=%%b" 
     set "afterGen=%%c" 
     set "X=!betweenGens:~0,1!" 
     set /A Xm1=X-1, Xp1=X+1 
     echo !beforeGen!Gen_1_!Xm1!!betweenGens:~1!Gen.1.!Xm1!!afterGen:~1! 
    ) 
    ) 
    echo !line! 
    if defined X (
     echo !beforeGen!Gen_1_!Xp1!!betweenGens:~1!Gen.1.!Xp1!!afterGen:~1! 
    ) 
goto :processFile 

回答

0

據我所知,Windows批處理沒有內置選項。 我只想用一個臨時文件:

call :processFile <template.html> tmp_file 
move tmp_file template.html 

如果的Unix/Linux用戶感興趣的是一個答案:

有科林·沃森的sponge(在moreutils包包裝用於Debian) :

theConvertProgram < template.html | sponge template.html 

更多信息請參見https://unix.stackexchange.com/a/29744/15241

解決方案與臨時文件:

theConvertProgram <template.html> tmp_file 
mv tmp_file template.html 

改進版本mktemp

TEMP_FILE="$(mktemp)" 
theConvertProgram <template.html> "$TEMP_FILE" 
mv "$TEMP_FILE" template.html 
+0

這種方法將工作,但你會如何寫它與該目錄中的所有文件自動執行。 html擴展而不是「template.html」嗎? – Blainer 2012-03-20 16:05:18

+0

使用通配符? * .html – 2012-03-20 16:18:31

+0

會這樣工作嗎? 'call:processFile < *.html > tmp_file' 'move tmp_file * .html' – Blainer 2012-03-20 16:21:29