5

私が書いているWindowsバッチファイルに少し問題があります。

特定の行を別のバッチファイルに書き込むためにバッチファイルが必要です。私が使用している方法は次のとおりです。

type NUL > batchfile.bat
ECHO texttobewrittentofile >> batchfile.bat
ECHO texttobewrittentofile >> batchfile.bat
ECHO texttobewrittentofile >> batchfile.bat
...
etc

ほとんどの行は正常に書き込みますが、バッチファイルを別のバッチファイルに書き込む際に発生するいくつかの異なる問題があります。

バッチファイルを別のバッチファイルに書き込むためのコードは次のとおりです。

ECHO @echo off >> GenerateEmail.bat
ECHO ECHO Opening Stunnel >> GenerateEmail.bat
ECHO pushd .\stunnel\ >> GenerateEmail.bat
ECHO start "" stunnel.exe stunnel.conf >> GenerateEmail.bat
ECHO popd >> GenerateEmail.bat
ECHO ECHO Determining latest log for use with blat >> GenerateEmail.bat
ECHO pushd O:\Logs\%clientname%\ >> GenerateEmail.bat
ECHO for /f "tokens=*" %%a in ('dir /b /od') do set newest=%%a >> GenerateEmail.bat
ECHO popd >> GenerateEmail.bat
ECHO ECHO Generating email containing contents of latest log >> GenerateEmail.bat
ECHO pushd .\blat307\full\ >> GenerateEmail.bat
ECHO ECHO Y | xcopy "O:\Logs\%clientname%\%newest%" ".\" >> GenerateEmail.bat
ECHO blat.exe "%newest%" -to %clientemail% -cc %gmailemail% -server 127.0.0.1:1099 -subject "Offsite Backup for "%1" "%2" - %clientname%" -sig sig.txt >> GenerateEmail.bat
ECHO DEL .\*.log >> GenerateEmail.bat
ECHO popd >> GenerateEmail.bat
ECHO ECHO Closing Stunnel >> GenerateEmail.bat
ECHO pushd .\stunnel\ >> GenerateEmail.bat
ECHO stunnel.exe -exit >> GenerateEmail.bat
ECHO popd >> GenerateEmail.bat

希望する出力が得られません。次の問題が発生しています。

ECHO Y | xcopy "O:\Logs\%clientname%\%newest%" ".\" >> GenerateEmail.bat

として出てくる

0 File(s) copied

また、%%が必要な場合は、%として出力されます。また、「blat.exe」で始まる行は、他の問題の中でもまったく書き込まれていません。それらの行に含まれているコマンドや記号を確認せずにテキストの行を書き込むためにバッチファイルを取得する方法はありますか?

ケイン。

4

1 に答える 1

10

のようなすべての特殊文字は、引用符で囲むか、引用符で囲む^ & | < >必要があり^^ ^& ^| ^< ^>ます。

すべてのパーセントは常に2倍にする必要があります。例えば:

  • "%1"になります"%%1"
  • %newest%になります%%newest%%
  • %%aになります%%%%a

すべてのECHOステートメントを括弧で囲む場合は、出力ファイルをクリアして各行をリダイレクトする必要はありません。これを行う場合は、右括弧もエスケープする必要があります。

>GenerateEmail.bat (
  echo Line 1
  echo Line 2
  echo these must be escaped ^^ ^& ^| ^> ^< ^), these not "^ & | > < )"
)

!遅延拡張を有効にしていて、、または!を含む出力がある場合、ルールはより複雑になります^

特殊文字をエスケープしてパーセントを2倍にする方法を理解する必要を回避する他の方法があります。

各行の前:::にFINDSTRを付け、FOR / FをFINDSTRで使用して、目的の出力を取得できます。出力にが含まれている場合は、遅延拡張がオフになっていることを確認してください!。以下のコードの唯一の制限は、出力行をで始めることができないことです:(スペースで始まり、その後に:)が続く場合があります。

(for /f "tokens=* delims=:" %%L in ('findstr /b ::: "%~f0"') do echo %%L) >GenerateEmail.bat
:::echo special chars & | < > don't need to be escaped
:::echo % does not need to be doubled
::: :Label
::: :: Comment and label must be indented with at least one space
:::etc

別のオプションは、次の場所にある手法の1つを使用することです。

于 2013-01-30T12:48:26.597 に答える