2

誰か助けてください...ああ、私はとても感謝します。ユーザーが入力を入力するたびに、必要なファイル内の文字列を置き換えることを除いて、完全に機能する非常に長いバッチファイルがありますが、ファイル内の !s を削除すると、XML 構成ファイルであるために問題が発生し、これらがコメント化されます。とどまる必要があるセクション。要求されない限り、ここにコード全体を入れるつもりはありませんが、簡単に言うと、ユーザーが特定の入力を行うと、バッチ ファイルが実行されます...ここに 1 つのファイルのコードの一部があります....ユーザーがドライブに入りますインストールの文字と bdi サーバーの名前。ユーザー入力で %drive% と %bdi1% を置き換えたい....それは....しかし、コメントアウトされたセクションを置き換えたくありません...つまり::

<!-- Tcp message preamble and postamble are flags that mark the beginning and end of an HL7 message. turns into <-- Tcp message preamble and postamble are flags that mark the beginning and end of an HL7 message.

なしに注意してください!

これが私のコードです... ! の削除を停止するにはどうすればよいですか。私はここを見てみましたが、Jebの答えは順調に進んでいると思いましたが、うまくいきませんでした。前もって感謝します

if exist newfile.txt del newfile.txt
for /F "usebackq delims=" %%a in ("%drive%:\mckesson\%bdi1%\importer.config") do (
set str=%%a
set str=!str:server_name=%server%!
echo !str! >> newfile.txt
)
del importer.config
rename newfile.txt importer.config



if exist newfile.txt del newfile.txt
for /F "usebackq delims=" %%a in ("%drive%:\mckesson\%bdi1%\importer.config") do (
set str=%%a
set str=!str:bdi_name=%bdi1%!
echo !str! >> newfile.txt
)
del importer.config
rename newfile.txt importer.config



if exist newfile.txt del newfile.txt
for /F "usebackq delims=" %%a in ("%drive%:\mckesson\%bdi1%\importer.config") do (
set str=%%a
set str=!str:share_name=%share%$!
echo !str! >> newfile.txt
)
del importer.config
rename newfile.txt importer.config


if exist newfile.txt del newfile.txt
for /F "usebackq delims=" %%a in ("%drive%:\mckesson\%bdi1%\importer.config") do (
set str=%%a
set str=!str:drive_bdi=%drive%!
echo !str! >> newfile.txt
)
del importer.config
rename newfile.txt importer.config
4

1 に答える 1

7

これは、展開の遅延とバッチ パーサーの影響です。
遅延展開が無効になっている場合、感嘆符に問題はありませんが、有効になっている場合、パーサーは!変数を展開するためのものであると想定し、マークが 1 つしかない場合はドロップします。

したがって、解決策は遅延拡張を無効にすることですが、必要に応じて有効にする必要があります。

これは、適切なタイミングで切り替えるだけで実行できます。

setlocal DisableDelayedExpansion
(
  for /F "usebackq delims=" %%a in ("%drive%:\mckesson\%bdi1%\importer.config") do (
    set "str=%%a"
    setlocal EnableDelayedExpansion
    set "str=!str:server_name=%server%!"
    set "str=!str:bdi_name=%bdi1%!"
    set "str=!str:share_name=%share%$!"
    set "str=!str:drive_bdi=%drive%!"
    echo(!str!
    endlocal
  )
) > newfile.txt

リダイレクションを完全な FOR ブロックに移動します。より高速であり、最初にファイルを削除する必要はありません。
すべての置換を 1 つのブロックに移動しようとするため、ファイルを一度だけ読み取る必要があります。

于 2012-10-25T05:28:56.437 に答える