2012-02-13 12 views
2

テンプレートファイル(myTemplate.txtなど)があり、このテンプレートから自分のファイル(myFile.txtなど)を作成するためにいくつか編集する必要があります。ファイル内のテキストを検索/置換するバッチコマンド

だからテンプレートは、私は次のようにこれを交換することにしたい

env.name= 
env.prop= 
product.images.dir=/opt/web-content/product-images 

のような行が含まれています。

env.name=abc 
env.prop=xyz 
product.images.dir=D:/opt/web-content/product-images 

ですから、以下を行うためのバッチコマンドを探しています。

1. Open the template file. 
2. Do a kind of find/replace for the string/text 
3. Save the updates as a new file 

どうすればよいですか?遅延拡張が有効になっている間

env.name=!env.name! 
env.prop=!env.prop! 
product.images.dir=/opt/web-content/product-images 

そして、ファイルの読み込みと書き込みにFORループを使用します:

答えて

5

最も簡単なルートは、このような何かを見て、あなたのテンプレートを変更することです

@echo off 
setlocal enableDelayedExpansion 
set "env.name=abc" 
set "env.prop=xyz" 
(
    for /f "usebackq delims=" %%A in ("template.txt") do echo %%A 
) >"myFile.txt" 

上書きリダイレクト>をループ全体に使用する方がはるかに高速ですが、ループ内で追加リダイレクション>>を使用する方が便利です。

上記は、テンプレートの行が;で始まらないことを前提としています。そうであれば、FOR EOLオプションを行を開始しない文字に変更する必要があります。おそらく等しい - for /f "usebackq eol== delims="

また、上記のテンプレートには、保存する必要がある空白行が含まれていないと仮定しています。ある場合は、次のように、あなたは上記を変更することができます(これはまた、任意の潜在的なEOLの問題を解消)

@echo off 
setlocal enableDelayedExpansion 
set "env.name=abc" 
set "env.prop=xyz" 
(
    for /f "delims=" %%A in (`findstr /n "^" "template.txt"') do (
    "set ln=%%A" 
    echo(!ln:*:=! 
) 
) >"myFile.txt" 

最後の潜在的なその複雑さISSEがあります - テンプレートは!^リテラルが含まれている場合は、問題を抱えている可能性があります。テンプレート内の文字をエスケープするか、いくつか追加の置換を使うことができます。

template.txt

Exclamation must be escaped^! 
Caret ^^ must be escaped if line also contains exclamation^^^! 
Caret^should not be escaped if line does not contain exclamation point. 
Caret !C! and exclamation !X! could also be preserved using additional substitution. 

templateProcessor.bat

setlocal enableDelayedExpansion 
... 
set "X=^!" 
set "C=^" 
... 
からの抽出物