1

古いアカウントに何が起こったのか分からないので、この新しいアカウントを作成する必要がありました。作成したバッチ ファイルに問題があります。ユーザーが特定の情報を入力すると、入力がファイル内のテキストを置き換える場所で機能します。しかし、私が抱えている問題は、ここで正確に答えを見つけることができなかったり、私を助けてくれなかったりすることです.引用符内のデータをどのように置き換えますか? 引用符をエスケープしようとしましたが、それが見つかったのか、それを置き換えていないのか、それとも何なのかわかりません。ここにその部分があります

setlocal DisableDelayedExpansion
(
  for /F "usebackq delims=" %%a in ("%drive%:\bdi\%bdi1%\importer.config") do (
    set "str=%%a"
    setlocal EnableDelayedExpansion
    set "str=!str:""saveTcpMessage"" value=""True""="saveTcpMessage" value="False"!"

    echo(!str!
    endlocal
  )
) > %drive%:\bdi\%bdi1%\newfile.txt
%drive%:
cd "%drive%:\bdi\%bdi1%"
del importer.config
rename newfile.txt importer.config
pause

上記の例では、バッチ ファイルが importer.config というファイルで次の文字列を検索するようにします。

<add key="saveTcpMessage" value="True" />

上記の値が見つかった場合は、次の値に置き換えます。

<add key="saveTcpMessage" value="False" />

dbl引用符をエスケープする必要があることがわかります..しかし、置換部分は機能していません。置換でも二重引用符を使用しようとしましたが、役に立ちませんでした。

どんな助けでも大歓迎です。

4

2 に答える 2

1

cmd.exe パーサーは、そのような引用符をエスケープしません。引用符をエスケープするには^"、 を使用する必要がありますが、これは、すべての引用符と、などのすべての特殊文字をエスケープする必要があることを意味します< &。パーサーがエスケープされていない引用符を検出すると、次の引用符が検出されるまで、引用符のセマンティクスが有効になります。引用符をエスケープすることは不可能です。

しかし、あなたの場合、上記のすべては実際には重要ではありません=.変数展開検索と置換の検索部分に含めることができないため、アプローチ全体が機能しません。これは、バッチ プログラミングを悩ませる多くの小さな「落とし穴」の 1 つです。

要素と同じ行に他の XML 要素が存在しないことを保証できる場合
<add key="saveTcpMessage" value="True" />は、正しい行があることを確認してから、「True」を「False」に置き換えることができます。しかし、おそらくその保証を行うことはできません。XML には固有の行構造がないため、データを 1 つの連続した行として再フォーマットしても、同じ意味を持つ有効な XML になります。または、要素を複数の行に分割することもできます。

バッチ ファイルは一般に、テキスト ファイルの処理にはあまり適していません。特に、XML の処理は苦手です。あなたはそれを行うことができますが、遅くなる多くの難解なコードが必要になります. よほど頭が良くない限り、バッチ ファイル ソリューションは脆弱であり、誰かが XML 入力を再フォーマットしてコードを壊してしまう可能性があります。

他の言語またはユーティリティ (理想的には XML で動作するように設計されたユーティリティ) を使用することをお勧めします。ただし、VBScript、JScript、または PowerShell も機能します。これらの言語では、少なくとも、試みている文字通りの検索と置換を簡単に行うことができます。

本当にバッチ スクリプトを使用したい場合は、 「究極の」ファイル検索と置換バッチ ユーティリティを DosTips に投稿しました。スクリプトの使用方法に関するドキュメントは、コード内に埋め込まれています。

もう 1 つのオプションは、ハイブリッド JScript/バッチ ソリューションです。バッチの正規表現検索と置換 - ファイルを簡単に編集できます。、再び DosTips に投稿されました。完全なドキュメントもそのコードに埋め込まれています。

2 番目のリンクにある REPL.BAT スクリプトを作成すると仮定すると、次のことができます。

@echo off
setlocal

:: define drive and bdi1 as needed

set "file=%drive%:\bdi\%bdi1%\importer.config"
set "search=<add key="saveTcpMessage" value="True" />"
set "replace=<add key="saveTcpMessage" value="False" />"

type "%file% | repl.bat search replace el >"%file%.new"
move /y "%file%.new" "%file%"
于 2012-12-05T22:31:06.883 に答える