我的工作批處理文件掃描一長串遠程服務器,將任何內容複製到本地服務器,檢查日誌文件中的關鍵字,以及是否找到關鍵字發送電子郵件。我注意到它總是發送電子郵件,即使有一個空白的日誌文件。兩個使用%1的循環 - 延遲擴展?
我發現這兩個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!
也不起作用。
有人會以我的方式指出錯誤,並提供建議或資源,這將有助於我解決這個問題嗎?
對不起;我不打算審查有關的信息。它看起來並不重要。我已經更新它以包含文件的全文。再看一遍,我最好的猜測是第一個'FOR'loop將%1設置爲文本列表中的最後一個服務器名稱(nt-whtever),第二個循環提取相同的%1,它始終是'> nul' – UserUnknown
我使用了@ foxidrive和你自己的'GOTO:EOF'建議,並將':mailtest'部分的代碼改爲你的建議變體。這工作很好。現在我更好地理解了'goto:eof'的使用,以及搜索文本的新方法,我可以在其他項目中使用它。非常有用和偉大的新知識 - 謝謝! – UserUnknown