私の作業用バッチ ファイルは、リモート サーバーの長いリストをスキャンし、そこにあるものをすべてローカル サーバーにコピーし、ログ ファイルでキーワードをチェックし、キーワードが見つかった場合は電子メールを送信します。ログファイルが空の場合でも、常にメールを送信していることに気付きました。
FOR
両方のループが%1
出力に変数を使用していることを発見しましECHO %1
た:servermove
。より良い説明がない%1
ため、ループ間で null にリセットされません。
SETLOCAL ENABLEDELAYEDEXPANSION
私はほぼ十数の SO 投稿を確認しましたが、これを使用するとこれが解決すると確信しています。それが私の理解の終わりであり、これまでのところ私は成功していません。
関連するコードは次のとおりです。
SET DATE=%date:~4,2%-%date:~7,2%-%date:~10,4%
SET HH=%time:~0,2%
SET MN=%time:~3,2%
SET TSTAMP=Time Run is %HH%%MN%
SET DATETIME=%DATE% at %HH%%MN%
SET LOGFILE="\\nt980a3\CreditFileImagesTransmission\LogFiles\%DATETIME%-File Move Log.txt"
SET MailDst=
SET MailSrc=
SET MailSrcName=Center to LDSD File Mover
SET OKMailSub=A Branch Has Sent You Some Files
ECHO %DATETIME% > %LOGFILE%
ECHO. >> %LOGFILE%
FOR /F "tokens=1" %%A IN (%~dp0SourceServers.txt) DO CALL :ServerMove %%A
:cleanuplogs
PUSHD "\\nt980a3\CreditFileImagesTransmission\LogFiles" &&(
FORFILES /S /M *.txt /D -45 /C "CMD /C DEL /Q @path"
) & POPD
:mailtest
FOR /F "tokens=*" %%A IN (%LOGFILE%) DO CALL :searchlog "%%A"
:searchlog
ECHO %1 | find "\\nt">NUL
IF NOT ERRORLEVEL 1 GOTO successmail
GOTO exit
:successmail
IF EXIST %temp%\to.txt DEL %temp%\to.txt
FOR %%a IN (%MailDst%) DO ECHO %%a>>%temp%\to.txt
"%~dp0sendmail.exe" /TO=%temp%\to.txt /FROM=%MailSrcName% ^<%MailSrc%^> /REF=%OKMailSub% /MESSAGE=%LOGFILE% /HOST=
:exit
EXIT
:ServerMove
DIR /S /B \\%1\CreditFileImagesTransmission\*.* >> %LOGFILE%
XCOPY /E /C /I /Y "\\%1\CreditFileImagesTransmission\*.*" "\\nt980a3\CreditFileImagesTransmission\%DATE%\%HH%%MN%\"
FOR /D %%P IN ("\\%1\CreditFileImagesTransmission\*.*") DO RMDIR "%%P" /Q /S
DEL /Q /S "\\%1\CreditFileImagesTransmission\*.*"
:mailtest
両方のインスタンスで使用するように変更しようとしまし%%B
たが、それも失敗します。どちらか一方のループの前にSETLOCAL ENABLEDELAYEDEXPANSION
とその対応物を配置し、 toを変更しても機能しません。ENDLOCAL
%%A
!A!
誰かが私のやり方の誤りを親切に指摘し、これを解決するのに役立つ提案やリソースを提供してくれませんか?