最大の問題は、<
と>
シンボルがXMLファイルのいたるところに散らかっていることです。(HTMLも)。
バッチでは、これらはリダイレクト文字であり、非常に注意深く処理しない限り、それらを含むテキストを処理するすべての行でエラーが発生します。おそらくそれでも。
発生する必要があるのは、これらが別のものに置き換えられることです。バッチエスケープ文字^
+シンボル、または他の何かによって完全に。それらをエスケープする際の問題は、その文字列がバッチコマンドにさらされるたびに、エスケープ文字が消えることです。
したがって、すべてのリダイレクトシンボルをエスケープするとします。
次にその文字列を変更すると、エスケープ文字はリダイレクト記号をエスケープすることで機能しますが、そうすることで「使い果たされ」、文字列から消えます。つまり、次にその文字列に対して何かを実行すると、それらは存在せず、何も何にもリダイレクトしないためにエラーが発生します。または何もない、または....など。
文字列を二重引用符で囲むことで回避できますが、二重引用符を使用すると、独自の問題が発生します。これらの問題は、二重引用符の使用方法によって異なります。紐の中に入れますか?文字列の周り?または、コマンドをそれらで囲みますか。すべてのテクニックには欠点と制限があります。そのうちの1つは、これらのテクニックの2つを組み合わせることができないということです。もちろん、すべてのテクニックを組み合わせることができます。
最後に、ファイルの途中(実際には最後以外の場所)に実際に行を挿入するには、新しいファイルを作成し、そのファイルの適切なポイントに到達したときにそのファイルに行を追加する必要があります。つまり、データ行に加えたすべての変更を元に戻す必要があります。その後、リダイレクト文字をエスケープします(文字列を二重引用符で囲むと、XMLパーサーが混乱するだけです)。面倒な文字を単純に削除することは、オプションではありません。
あなたのバッチの肉は次のようになります:
setlocal enabledelayedexpansion
set source=c:\whatever.xml
set dest=c:\temp.xml
for /f "tokens=*" %%x in (%source%) do (
:: One technique for dealing with redirection characters
set "line=%%x"
make_line_palitable_to_batch
if (line_contains_flag) (
do_calculation_or_manipulation
echo restored_!line!>>%dest%
)
echo restored_!line!>>%dest%
)
move /y %dest% %source%
それは疑似コードのそれらの小さな行でmake_line_palitable_to_batch
あり、restored_!line!
それはあなたを殺します。
置き換える必要のある文字の1つは
"
その文字の置換に取り組んでいる場合、必要なデータが含まれている行と新しいデータを挿入する場所を認識して、リダイレクト文字を置換するためのコードを提供し、必要に応じてコードを修正します。(二重引用符の置換には注意が必要ですが、検索と置換の最も基本的な方法が機能することに注意してください。)
これを行った後、質問を編集して作業を含めます。
また、あなたは完璧である必要はありません、ただ少しの努力を示してください、そして私はあなたを助けます。