我的工作批处理文件扫描一长串远程服务器,将那里的任何内容复制到本地服务器,检查日志文件中的关键字,如果找到关键字,则发送电子邮件。我注意到它总是在发送电子邮件,即使是空白日志文件也是如此。
我发现两个FOR
循环都使用%1
变量作为它们的输出 - 如在ECHO %1
被调用的每一行中所见:servermove
。由于缺乏更好的解释,它不会%1
在循环之间重置为空。
我查看了近十几篇 SO 帖子,并且有点相信使用SETLOCAL ENABLEDELAYEDEXPANSION
会解决这个问题。这就是我的理解结束的地方,到目前为止我还没有成功。
以下是相关代码:
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
及其对应物ENDLOCAL
放在一个或另一个循环之前并将其更改%%A
为!A!
也不起作用。
有人会以我的方式指出错误并提供可以帮助我解决此问题的建议或资源吗?