如何在 Windows 批处理脚本中每 30 分钟检查一次文件的大小,并在出现异常时发送电子邮件?

问题描述 投票:0回答:1
  • 我的电脑中有一个 json 文件。我的目标是编写一个脚本并让它每 30 分钟自动运行一次
  • 脚本将获取文件名并检查其大小,如果小于 500Kb,它将触发电子邮件显示 [电子邮件受保护]

我尝试编写一个脚本,但运行此脚本后我得到“其他是意外的”。这是脚本:

@echo off
set "file="C:\CodeBases\DumpStack.log"
set MAXBYTESIZE=500000

for /f "usebackq" %%A in ("%file%") do set /a size=%%~zA

if %size% GTR %MAXBYTESIZE% (
    echo(%file% is too large
) else (
    echo(%file% is ^<^> %size% bytes long
)

pause
windows powershell scripting
1个回答
0
投票

我选择这个问题是为了看看我是否能解决它。

我的测试环境是64位Windows。我想那没问题。从标签和链接我认为它应该是一个批处理脚本。 cron 工作似乎对我来说更有意义。 另外,由于密码技术原因,发送电子邮件这件事对我来说似乎有点困难。 或者创建垃圾邮件模板。或者更设置一个 SMTP 服务器。

所以这是批处理脚本:

@ECHO OFF

REM -> Start batch in a new window
IF "%~1" == "" START "FileSize Checker in 30min - Mail" %comspec% /K "%~F0 INLINE" & GOTO :Exit

REM -> Jump to label according passed parameter/arg
IF /I "%~1" == "Keychecker" GOTO :Keychecker

REM -> Settings
SET MAILSERVER=a.mail.server
SET MAILSERVERPORT=587
SET MAILUSERNAME=user
SET [email protected]
SET MAILSUBJECT=File Checker in 30min - Report
SET MAILBODY=See attached logfile ( good luck ^^^^^^^^ )
SET LOGFILE=%temp%\FileSizeCheckerin30minMail.log
REM -> For testing I use the logfile (your file to check)
SET MYFILETOCHECK=%LOGFILE%
REM -> File size target bytes for switch (for kb * 1024)
SET /A TargetSize=512000
REM -> Set a higher number than 0 (max. 30) to end the loop earlier
SET /A TargetMinutes=0

REM -> Save old codepage
FOR /F "tokens=2 delims=:." %%x IN ('CHCP') DO SET cp=%%x
REM -> SET codepage according to my text language (maybe has to be changed)
CHCP 1252>NUL

REM -> Get/set current path (wo last backslash)
SET CALLPath=%~dp0
SET CALLPath=%CALLPath:~0,-1%
SET CurrentFolder=%CD%

REM -> Change directory to user temp folder (just in case)
CD /D "%temp%"

REM -> Save some vars which should be reseted at end of batch
SET CurrentTitle=cmd
REM -> Fetch Title and PID, a little bit hacky...
FOR /F "tokens=2" %%i IN ('wmic process get parentprocessid^,name^|find "cmd"') DO SET CmdPID=%%i
FOR /F "tokens=2" %%i IN ('tasklist /fi "pid eq %CmdPID%" /fo list /v') DO SET CurrentTitle=%%i

REM -> Workarround for flickering / remove cursor
FOR /F %%e IN ('ECHO Prompt $E^|cmd') DO SET "\E=%%e"

REM -> Activate extensions
SETLOCAL EnableExtensions EnableDelayedExpansion

REM -> Downsize the console
REM FOR /f "skip=3 delims=: tokens=2" %%A IN ('MODE CON') DO (
REM    IF DEFINED CONLINES IF NOT DEFINED CONCOLS SET /a CONCOLS=%%A
REM    IF NOT DEFINED CONLINES SET /a CONLINES=%%A
REM )
FOR /F "tokens=3" %%A IN ('reg query HKCU\Console /v WindowSize') DO SET /A CONLINES=%%A/65535
FOR /F "tokens=3" %%A IN ('reg query HKCU\Console /v WindowSize') DO SET /A CONCOLS=%%A&0xffff
MODE CON cols=85 lines=22

REM -> Ensure previous temp files removed in case program exited incorrectly
DEL /Q /F "LOGFILE" 2>NUL
DEL /Q /F "%temp%\CMDrun.log" 2>NUL
DEL /Q /F "%temp%\CMDend.log" 2>NUL
DEL /Q /F "%temp%\CMDchoice.log" 2>NUL

REM -> Internal threads (almost empty this time - only the color setter and the good old xcopy abuse)
CALL :setESC
START /B /SHARED "Keychecker" "%~F0" Keychecker 2>NUL

REM -> This will remove the cursor
<NUL SET /P "=%\E%[?25l"


REM -> Prepair for a new loop
:PREPAIR

>"%LOGFILE%" ECHO TIMER START

REM -> Setup a timeing system
SET /A TIMER_XMIL=%time:~-1%
SET /A TIMER_YMIL=%time:~-2,-1%
SET /A TIMER_XSEC=%time:~-4,-3%
SET /A TIMER_YSEC=%time:~-5,-4%
SET /A TIMER_XMIN=%time:~-7,-6%
SET /A TIMER_YMIN=%time:~-8,-7%
IF "%TIMER_YMIL%" == "0" (
   SET /A TIMER_MIL=%TIMER_XMIL%
) ELSE (
   SET /A TIMER_MIL=%TIMER_YMIL%%TIMER_XMIL%
)
IF "%TIMER_YSEC%" == "0" (
   SET /A TIMER_SEC=%TIMER_XSEC%
) ELSE (
   SET /A TIMER_SEC=%TIMER_YSEC%%TIMER_XSEC%
)
IF "%TIMER_YMIN%" == "0" (
   SET /A TIMER_MIN=%TIMER_XMIN%
) ELSE (
   SET /A TIMER_MIN=%TIMER_YMIN%%TIMER_XMIN%
)
IF %TIMER_SEC% EQU 59 (
   SET /A TIMER_SEC_T=0
) ELSE (
   SET /A TIMER_SEC_T=%TIMER_SEC% + 1
)
IF %TIMER_MIN% LSS 30 (
   SET /A TEATIME=%TIMER_MIN% + 30
) ELSE (
   SET /A TEATIME=%TIMER_MIN% - 30
)
SET /A CURRENTZZZ=7
SET NOSENDMAIL=NOPE


REM -> The big main loop...
:LOOP
SET /A TIMER_XMIL=%time:~-1%
SET /A TIMER_YMIL=%time:~-2,-1%
SET /A TIMER_XSEC=%time:~-4,-3%
SET /A TIMER_YSEC=%time:~-5,-4%
SET /A TIMER_XMIN=%time:~-7,-6%
SET /A TIMER_YMIN=%time:~-8,-7%
IF "%TIMER_YMIL%" == "0" (
   SET /A TIMER_MIL=%TIMER_XMIL%
) ELSE (
   SET /A TIMER_MIL=%TIMER_YMIL%%TIMER_XMIL%
)
IF "%TIMER_YSEC%" == "0" (
   SET /A TIMER_SEC=%TIMER_XSEC%
) ELSE (
   SET /A TIMER_SEC=%TIMER_YSEC%%TIMER_XSEC%
)
IF "%TIMER_YMIN%" == "0" (
   SET /A TIMER_MIN=%TIMER_XMIN%
) ELSE (
   SET /A TIMER_MIN=%TIMER_YMIN%%TIMER_XMIN%
)

REM -> Synchronize msec to sec (target 1 sec per run)
IF NOT %TIMER_SEC% EQU %TIMER_SEC_T% GOTO :LOOP

REM -> Exit the loop if temp file exists (Keychecker passed)
(IF EXIST "%temp%\CMDend.log" GOTO :EndOfBatch) 2>NUL
REM -> Handle choices
IF EXIST "%temp%\CMDchoice.log" IF NOT DEFINED GETKEY FOR /F "usebackq tokens=1 delims=" %%X IN ("%temp%\CMDchoice.log") DO SET GETKEY=%%X
REM -> r)   Restart
IF "!GETKEY!" == "r" (
   SET GETKEY=DONE
   DEL /Q /F "%temp%\CMDchoice.log" 2>NUL
   SET "GETKEY="
   GOTO :PREPAIR
)
REM -> s)   Set mail password
IF "!GETKEY!" == "s" (
   SET GETKEY=DONE
   DEL /Q /F "%temp%\CMDchoice.log" 2>NUL
   SET "GETKEY="
   SET FROMLABEL=LOOP
   GOTO :SETPW
)

REM -> Determinate remaining time
IF %TIMER_SEC% EQU 59 (
   SET /A TIMER_SEC_T=0
) ELSE (
   SET /A TIMER_SEC_T=%TIMER_SEC% + 1
)
SET /A TIMELEFT=%TEATIME% - %TIMER_MIN%
IF %TIMELEFT% LSS 0 SET /A TIMELEFT=60 + %TIMELEFT%
SET /A SECDUMMY=59 - %TIMER_SEC%

REM -> Log the time
>>"%LOGFILE%" ECHO %date% - %time%

REM -> If time is over ...
IF %TIMELEFT% EQU %TargetMinutes% IF %SECDUMMY% EQU 0 GOTO :SLEEPOVER

REM -> Output text animation
FOR /L %%G IN (0,1,29) DO (
   SET PERCENT[%%G]=_
   IF %TIMELEFT% LEQ %%G SET PERCENT[%%G]=X
)
SET /A CURRENTZZZ=%CURRENTZZZ% + 1
IF %CURRENTZZZ% GTR 7 (
   SET /A CURRENTZZZ=-1
   SET ZZZ[0]=%ESC%[30m
   SET ZZZ[1]=%ESC%[30m
   SET ZZZ[2]=%ESC%[30m
   SET ZZZ[3]=%ESC%[30m
   SET ZZZ[4]=%ESC%[30m
   SET ZZZ[5]=%ESC%[30m
   SET ZZZ[6]=%ESC%[30m
   SET ZZZ[7]=%ESC%[30m
) ELSE (
   SET ZZZ[%CURRENTZZZ%]=%ESC%[33m
)
<NUL SET /P "=%\E%[?25l"
CLS
ECHO.
ECHO.
ECHO.     %ESC%[44m%ESC%[33m%ESC%[1m    Sleeping well inside the loop. %TIMELEFT% Minutes and %SECDUMMY% Seconds left.    %ESC%[0m
ECHO.
ECHO.         %ESC%[31mOPTIONS: %ESC%[35mr%ESC%[31m -^> Restart    %ESC%[35mq%ESC%[31m -^> Quit%ESC%[0m    %ESC%[35ms%ESC%[31m -^> Set Mail Password%ESC%[0m
ECHO.
ECHO.                         [!PERCENT[29]!][!PERCENT[28]!][!PERCENT[27]!][!PERCENT[26]!][!PERCENT[25]!][!PERCENT[24]!][!PERCENT[23]!][!PERCENT[22]!][!PERCENT[21]!][!PERCENT[20]!]
ECHO.                         [!PERCENT[19]!][!PERCENT[18]!][!PERCENT[17]!][!PERCENT[16]!][!PERCENT[15]!][!PERCENT[14]!][!PERCENT[13]!][!PERCENT[12]!][!PERCENT[11]!][!PERCENT[10]!]
ECHO.                         [!PERCENT[9]!][!PERCENT[8]!][!PERCENT[7]!][!PERCENT[6]!][!PERCENT[5]!][!PERCENT[4]!][!PERCENT[3]!][!PERCENT[2]!][!PERCENT[1]!][!PERCENT[0]!]
ECHO.
ECHO.
ECHO.
ECHO.
ECHO.                                         !ZZZ[7]!Z
ECHO.                                      !ZZZ[6]!z
ECHO.                                   !ZZZ[5]!Z
ECHO.                                !ZZZ[4]!z
ECHO.                             !ZZZ[3]!Z
ECHO.                          !ZZZ[2]!z
ECHO.                       !ZZZ[1]!Z
ECHO.                    !ZZZ[0]!z
TITLE FileSize Checker in 30min - Mail         %date%   -   %time%

GOTO :LOOP


REM -> Simple password storage, better than directly in the script, but probably not secure enough.
:SETPW
CLS
ECHO.
ECHO.
ECHO.     %ESC%[44m%ESC%[33m%ESC%[1m    This will set the password for your E-Mail account.    %ESC%[0m
ECHO.
ECHO.
ECHO.
<NUL SET /P "=%\E%[?25h"
<NUL SET /P=%ESC%[31m         Please enter password: 
SET /P MAILPW=
TITLE FileSize Checker in 30min - Mail - Set Password
>"%temp%\CMDrun.log" ECHO Continue
IF "%FROMLABEL%" == "LOOP" (
   SET /A TIMER_XSEC=!time:~-4,-3!
   SET /A TIMER_YSEC=!time:~-5,-4!
   IF "!TIMER_YSEC!" == "0" (
      SET /A TIMER_SEC=!TIMER_XSEC!
   ) ELSE (
      SET /A TIMER_SEC=!TIMER_YSEC!!TIMER_XSEC!
   )
   IF !TIMER_SEC! EQU 59 (
      SET /A TIMER_SEC_T=0
   ) ELSE (
      SET /A TIMER_SEC_T=!TIMER_SEC! + 1
   )
   SET /A TIMELEFTTEST=%TEATIME% - %TIMER_MIN% - 1
   IF !TIMELEFTTEST! LSS 0 SET /A TIMELEFTTEST=61 + !TIMELEFTTEST!
   IF !TIMELEFTTEST! GTR 29 GOTO :PREPAIR
   IF !TIMELEFTTEST! LSS 1 GOTO :PREPAIR
)
GOTO :%FROMLABEL%


REM -> Check for keypress q = quit / r = restart / s = password
:Keychecker
>"%temp%\CMDrun.log" ECHO Running
:KeycheckerLoop
SETLOCAL EnableDelayedExpansion
FOR /F "Delims=" %%A IN ('xcopy /w "%temp%\CMDrun.log" "%temp%\CMDrun.log" 2^>NUL') DO (
   IF NOT DEFINED Key SET "Key=%%A"
)
IF DEFINED Key (
   SET "Key=!Key:~-1!"
   IF "!Key!" == "r" (
      >"%temp%\CMDchoice.log" ECHO !Key!
   ) ELSE IF "!Key!" == "q" (
      >"%temp%\CMDend.log" ECHO !Key!
   ) ELSE IF "!Key!" == "s" (
      >"%temp%\CMDchoice.log" ECHO !Key!
      >"%temp%\CMDrun.log" ECHO Waiting
      SET DOWAIT=YE
   )
   (IF EXIST "%temp%\CMDend.log" GOTO :Exit) 2>NUL
)
:KeycheckerWaitLoop
IF "!DOWAIT!S" == "YES" (
   SET /P ISWAITING=<"%temp%\CMDrun.log"
   IF "!ISWAITING!" == "Waiting" (
      ping 1.2.3.4 -n 1 -w 1000 >NUL
      GOTO :KeycheckerWaitLoop
   )
)
ENDLOCAL
GOTO :KeycheckerLoop


REM -> Colors
:setESC
FOR /F "tokens=1,2 delims=#" %%a IN ('"PROMPT #$H#$E# & echo on & for %%b in (1) do rem"') DO (
   SET ESC=%%b
   GOTO :Exit
)


REM -> I actually mean well-rested, whatever ;)
:SLEEPOVER
SET ResultGood=YES
FOR /F "usebackq" %%A IN ('%MYFILETOCHECK%') DO SET Size=%%~zA
REM -> Not sure if that is right according to size of the file
IF %Size% LEQ %TargetSize% (
   SET Result=File is less or equal 500k : %Size%b
   SET ResultColor=%ESC%[42m
) ELSE (
   SET ResultGood=NOPE
   SET Result=Houston^, we have a problem. File is %Size%b :-(
   SET ResultColor=%ESC%[41m
)
>>"%LOGFILE%" ECHO "%Result%"

SET MAILMESSAGESEND=Sending mail now ...
SET MAILMESSAGENOTSEND=No password defined, skipping send mail
SET MAILMESSAGENOTSENDPW=Password defined but send mail skipped
SET MSGSWITCH=FALSE
SET CLSWITCH=TRUE
IF NOT DEFINED MAILPW SET MSGSWITCH=TRUE
GOTO :SLEEPOVERTEXT

:SLEEPOVERTEXTCLSWITCH
SET CLSWITCH=FALSE
:SLEEPOVERTEXT
CLS
ECHO.
ECHO.
ECHO.     %ESC%[44m%ESC%[33m%ESC%[1m    Dreaming over. Time to wake up. Let's see..    %ESC%[0m
ECHO.
ECHO.     %ResultColor%    %Result%    %ESC%[0m
ECHO.
ECHO.
ECHO.         %ESC%[31mOPTIONS: %ESC%[35mr%ESC%[31m -^> Restart    %ESC%[35mq%ESC%[31m -^> Quit%ESC%[0m    %ESC%[35ms%ESC%[31m -^> Set Mail Password%ESC%[0m
ECHO.
ECHO.
IF NOT DEFINED MAILPW ECHO.   !MAILMESSAGENOTSEND!
IF DEFINED MAILPW IF "%MSGSWITCH%" == "FALSE" ECHO.   !MAILMESSAGESEND!
IF DEFINED MAILPW IF "%MSGSWITCH%" == "TRUE" ECHO.   !MAILMESSAGENOTSENDPW!
REM -> This is the base64 encoded script to send the mail. Encoded because I think it's a smart way to include a script
IF DEFINED MAILPW IF NOT "!NOSENDMAIL!" == "YES" (
   powershell.exe -ExecutionPolicy ByPass -command "'%MAILSERVER%', '%MAILSERVERPORT%', '%MAILUSERNAME%', '!MAILPW!', '%MAILADRESS%', '%MAILSUBJECT%', '%MAILBODY%', '%LOGFILE%', ''" | powershell.exe -encodedcommand "cABhAHIAYQBtAA0ACgAoAA0ACgAgACAAIAAgAFsAUABhAHIAYQBtAGUAdABlAHIAKABNAGEAbgBkAGEAdABvAHIAeQApAF0ADQAKACAAIAAgACAAWwBzAHQAcgBpAG4AZwBbAF0AXQANAAoAIAAgACAAIAAkAHAAYQBzAHMAZQBkAEEAcgBnAHMADQAKACkADQAKAEMATABTAA0ACgBpAGYAIAAoACQAcABhAHMAcwBlAGQAQQByAGcAcwBbACQAcABhAHMAcwBlAGQAQQByAGcAcwAuAGMAbwB1AG4AdABdACAALQBlAHEAIAAiACIAKQAgAHsAIAAkAHAAYQBzAHMAZQBkAEEAcgBnAHMAWwAkAHAAYQBzAHMAZQBkAEEAcgBnAHMALgBjAG8AdQBuAHQAXQAgAD0AIAAkAG4AdQBsAGwAOwAgAH0ADQAKAGkAZgAgACgAJABwAGEAcwBzAGUAZABBAHIAZwBzAC4AYwBvAHUAbgB0ACAALQBsAHQAIAA3ACkAIAB7AA0ACgAJAFcAcgBpAHQAZQAtAEgAbwBzAHQAIAAiAFUAcwBhAGcAZQA6ACAAIABTAGUAbgBkAFIAZQBwAG8AcgB0AE0AYQBpAGwAIAAgACcAUwBFAFIAVgBFAFIAJwAsACAAIAAnAFAATwBSAFQAJwAsACAAIAAnAFUAUwBFAFIAJwAsACAAIAAnAFAAQQBTAFMAJwAsACAAIAAnAE0AQQBJAEwALQBBAEQAUgBFAFMAUwAnACwAIAAnAFMAVQBCAEoARQBDAFQAJwAsACAAIAAnAE0AQQBJAEwALQBUAEUAWABUACcAIgANAAoACQBXAHIAaQB0AGUALQBIAG8AcwB0ACAAIgBPAHAAdABpAG8AbgBhAGwAOgAgACAAJwBBAFQAVABBAEMASABNAEUATgBUAC0ARgBJAEwARQAtAFAAQQBUAEgAJwAgAFsAZABlAGYAYQB1AGwAdAA6ACAAbgB1AGwAbABdACwAIAAgACcAUwBFAEMAVQBSAEkAVABZAC0AUABSAE8AVABPAEMATwBMACcAIABbAGQAZQBmAGEAdQBsAHQAOgAgAFQATABTADEAMgBdACwAIAAgACcARQBuAGEAYgBsAGUAUwBTAEwAJwAgADAAIAAvACAAMQAgAFsAZABlAGYAYQB1AGwAdAA6ACAAMQBdACIADQAKAAkAWwBTAHkAcwB0AGUAbQAuAEUAbgB2AGkAcgBvAG4AbQBlAG4AdABdADoAOgBFAHgAaQB0ACgAMQApAA0ACgB9AA0ACgBpAGYAIAAoACQAcABhAHMAcwBlAGQAQQByAGcAcwBbADgAXQAgAC0AbgBlACAAJABuAHUAbABsACkAIAB7ACAAWwBTAHkAcwB0AGUAbQAuAE4AZQB0AC4AUwBlAHIAdgBpAGMAZQBQAG8AaQBuAHQATQBhAG4AYQBnAGUAcgBdADoAOgBTAGUAYwB1AHIAaQB0AHkAUAByAG8AdABvAGMAbwBsACAAPQAgACQAcABhAHMAcwBlAGQAQQByAGcAcwBbADgAXQA7ACAAfQANAAoAZQBsAHMAZQAgAHsAIABbAFMAeQBzAHQAZQBtAC4ATgBlAHQALgBTAGUAcgB2AGkAYwBlAFAAbwBpAG4AdABNAGEAbgBhAGcAZQByAF0AOgA6AFMAZQBjAHUAcgBpAHQAeQBQAHIAbwB0AG8AYwBvAGwAIAA9ACAAIgBUAEwAUwAxADIAIgA7ACAAfQANAAoAJABtAGUAcwBzAGEAZwBlACAAPQAgAG4AZQB3AC0AbwBiAGoAZQBjAHQAIABOAGUAdAAuAE0AYQBpAGwALgBNAGEAaQBsAE0AZQBzAHMAYQBnAGUAOwANAAoAJABtAGUAcwBzAGEAZwBlAC4ARgByAG8AbQAgAD0AIAAkAHAAYQBzAHMAZQBkAEEAcgBnAHMAWwA0AF0AOwANAAoAJABtAGUAcwBzAGEAZwBlAC4AVABvAC4AQQBkAGQAKAAkAHAAYQBzAHMAZQBkAEEAcgBnAHMAWwA0AF0AKQA7AA0ACgAkAG0AZQBzAHMAYQBnAGUALgBTAHUAYgBqAGUAYwB0ACAAPQAgACQAcABhAHMAcwBlAGQAQQByAGcAcwBbADUAXQA7AA0ACgAkAG0AZQBzAHMAYQBnAGUASQBzAEIAbwBkAHkASAB0AG0AbAAgAD0AIAAkAEYAYQBsAHMAZQA7AA0ACgAkAG0AZQBzAHMAYQBnAGUALgBCAG8AZAB5ACAAPQAgACQAcABhAHMAcwBlAGQAQQByAGcAcwBbADYAXQA7AA0ACgBpAGYAIAAoACQAcABhAHMAcwBlAGQAQQByAGcAcwBbADcAXQAgAC0AbgBlACAAJABuAHUAbABsACAALQBhAG4AZAAgACQAcABhAHMAcwBlAGQAQQByAGcAcwBbADcAXQAgAC0AbgBlACAAIgBuAHUAbABsACIAKQAgAHsADQAKACAAIAAgACAAJABhAHQAdABhAGMAaABtAGUAbgB0ACAAPQAgAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABOAGUAdAAuAE0AYQBpAGwALgBBAHQAdABhAGMAaABtAGUAbgB0ACgAJABwAGEAcwBzAGUAZABBAHIAZwBzAFsANwBdACkAOwANAAoAIAAgACAAIAAkAG0AZQBzAHMAYQBnAGUALgBBAHQAdABhAGMAaABtAGUAbgB0AHMALgBBAGQAZAAoACQAYQB0AHQAYQBjAGgAbQBlAG4AdAApADsADQAKAH0ADQAKACQAcwBtAHQAcAAgAD0AIABuAGUAdwAtAG8AYgBqAGUAYwB0ACAATgBlAHQALgBNAGEAaQBsAC4AUwBtAHQAcABDAGwAaQBlAG4AdAAoACQAcABhAHMAcwBlAGQAQQByAGcAcwBbADAAXQAsACAAJABwAGEAcwBzAGUAZABBAHIAZwBzAFsAMQBdACkAOwANAAoAaQBmACAAKAAkAHAAYQBzAHMAZQBkAEEAcgBnAHMAWwA5AF0AIAAtAG4AZQAgACIAMAAiACkAIAB7ACAAJABzAG0AdABwAC4ARQBuAGEAYgBsAGUAUwBTAEwAIAA9ACAAJAB0AHIAdQBlADsAIAB9AA0ACgBlAGwAcwBlACAAewAgACQAcwBtAHQAcAAuAEUAbgBhAGIAbABlAFMAUwBMACAAPQAgACQAZgBhAGwAcwBlADsAIAB9AA0ACgAkAHMAbQB0AHAALgBDAHIAZQBkAGUAbgB0AGkAYQBsAHMAIAA9ACAATgBlAHcALQBPAGIAagBlAGMAdAAgAE0AYQBuAGEAZwBlAG0AZQBuAHQALgBBAHUAdABvAG0AYQB0AGkAbwBuAC4AUABTAEMAcgBlAGQAZQBuAHQAaQBhAGwAIAAkAHAAYQBzAHMAZQBkAEEAcgBnAHMAWwAyAF0ALAAgACgAJABwAGEAcwBzAGUAZABBAHIAZwBzAFsAMwBdACAAfAAgAEMAbwBuAHYAZQByAHQAVABvAC0AUwBlAGMAdQByAGUAUwB0AHIAaQBuAGcAIAAtAEEAcwBQAGwAYQBpAG4AVABlAHgAdAAgAC0ARgBvAHIAYwBlACkADQAKACQAcwBtAHQAcAAuAHMAZQBuAGQAKAAkAG0AZQBzAHMAYQBnAGUAKQA7AA0ACgBpAGYAIAAoACQAcABhAHMAcwBlAGQAQQByAGcAcwBbADcAXQAgAC0AbgBlACAAJABuAHUAbABsACAALQBhAG4AZAAgACQAcABhAHMAcwBlAGQAQQByAGcAcwBbADcAXQAgAC0AbgBlACAAIgBuAHUAbABsACIAKQAgAHsAIAAkAGEAdAB0AGEAYwBoAG0AZQBuAHQALgBEAGkAcwBwAG8AcwBlACgAKQA7ACAAfQA="
)
ECHO.
ECHO.
ECHO.         Auto-Restart in T- ping 100 * 200
ECHO.

TITLE FileSize Checker in 30min - Mail - Result
SET NOSENDMAIL=YES

IF DEFINED MAILPW IF "!CLSWITCH!" == "TRUE" (
   SET MAILMESSAGESEND=Email sent
   GOTO :SLEEPOVERTEXTCLSWITCH
)

ping 1.2.3.4 -n 1 -w 100 >NUL
SET /A COUNTDOWN=199

:TPING
<NUL SET /P "=%\E%[?25l"
REM -> Exit the loop if temp file exists (Keychecker passed)
(IF EXIST "%temp%\CMDend.log" GOTO :EndOfBatch) 2>NUL
REM -> Handle choices (again)
IF EXIST "%temp%\CMDchoice.log" IF NOT DEFINED GETKEY FOR /F "usebackq tokens=1 delims=" %%X IN ("%temp%\CMDchoice.log") DO SET GETKEY=%%X
REM -> r)   Restart
IF "!GETKEY!" == "r" (
   SET GETKEY=DONE
   DEL /Q /F "%temp%\CMDchoice.log" 2>NUL
   SET "GETKEY="
   GOTO :PREPAIR
)
REM -> s)   Set mail password
IF "!GETKEY!" == "s" (
   SET GETKEY=DONE
   DEL /Q /F "%temp%\CMDchoice.log" 2>NUL
   SET "GETKEY="
   SET MAILMESSAGESEND=Email sent
   SET MAILMESSAGENOTSEND=No password defined, send mail skipped
   SET FROMLABEL=SLEEPOVERTEXT
   GOTO :SETPW
)

TITLE FileSize Checker in 30min - Mail - Result - Countdown %COUNTDOWN%
SET /A COUNTDOWN=%COUNTDOWN% - 1
ping 1.2.3.4 -n 1 -w 100 >NUL
IF %COUNTDOWN% NEQ 0 GOTO :TPING
GOTO :PREPAIR


REM -> Reset cursor, directory and other things (note to myself: don't forget ENDLOCAL)
:EndOfBatch
ping 1.2.3.4 -n 1 -w 200 >NUL
DEL /Q /F "%temp%\CMDrun.log" 2>NUL
DEL /Q /F "%temp%\CMDend.log" 2>NUL
DEL /Q /F "%temp%\CMDchoice.log" 2>NUL
<NUL SET /P "=%\E%[?25h"
MODE CON cols=!CONCOLS! lines=!CONLINES!
ENDLOCAL
CHCP %cp%>NUL
TITLE %CurrentTitle%
CD /D %CurrentFolder%
ping 1.2.3.4 -n 1 -w 100 >NUL
taskkill /PID %CmdPID%


:Exit

我创建了一个 base64 powershell 脚本作为邮件发件人。为了轻松地将其包含到批处理脚本中。发送者和接收者是一样的,就像我想把日志文件发送给自己一样。由于将参数发送到 Base64 脚本很困难,因此我使用了在网上找到的管道技巧。我对这个解决方案不满意,因为参数的输出几乎不可能 >null。

param
(
    [Parameter(Mandatory)]
    [string[]]
    $passedArgs
)
CLS
if ($passedArgs[$passedArgs.count] -eq "") { $passedArgs[$passedArgs.count] = $null; }
if ($passedArgs.count -lt 7) {
    Write-Host "Usage:  SendReportMail  'SERVER',  'PORT',  'USER',  'PASS',  'MAIL-ADRESS', 'SUBJECT',  'MAIL-TEXT'"
    Write-Host "Optional:  'ATTACHMENT-FILE-PATH' [default: null],  'SECURITY-PROTOCOL' [default: TLS12],  'EnableSSL' 0 / 1 [default: 1]"
    [System.Environment]::Exit(1)
}
if ($passedArgs[8] -ne $null) { [System.Net.ServicePointManager]::SecurityProtocol = $passedArgs[8]; }
else { [System.Net.ServicePointManager]::SecurityProtocol = "TLS12"; }
$message = new-object Net.Mail.MailMessage;
$message.From = $passedArgs[4];
$message.To.Add($passedArgs[4]);
$message.Subject = $passedArgs[5];
$messageIsBodyHtml = $False;
$message.Body = $passedArgs[6];
if ($passedArgs[7] -ne $null -and $passedArgs[7] -ne "null") {
    $attachment = New-Object Net.Mail.Attachment($passedArgs[7]);
    $message.Attachments.Add($attachment);
}
$smtp = new-object Net.Mail.SmtpClient($passedArgs[0], $passedArgs[1]);
if ($passedArgs[9] -ne "0") { $smtp.EnableSSL = $true; }
else { $smtp.EnableSSL = $false; }
$smtp.Credentials = New-Object Management.Automation.PSCredential $passedArgs[2], ($passedArgs[3] | ConvertTo-SecureString -AsPlainText -Force)
$smtp.send($message);
if ($passedArgs[7] -ne $null -and $passedArgs[7] -ne "null") { $attachment.Dispose(); }

批量动画具有众所周知的闪烁效果。那是一个难题。我终于找到了解决方案(网络没有帮助): 如果将回声组合在一条线中(& echo.BLA ...),它看起来非常平滑。由于代码的可读性,我没有这样做。

由于我认为将密码保存在文件中不是一个好主意,因此我添加了密码用户输入。这当然不理想,但可能更好。

总的来说,它有效。我收到了邮件。创作起来很有趣。但绝对不适合专业用途。

批处理脚本不会检查邮件是否已成功发送。仅当尝试调用 ps 脚本时才会打印出来。为了成功检查,必须完成以下步骤:

  • 检查 ps 脚本内的错误级别并将结果输出到临时文件
  • 解析批处理内的out文件并打印出结果

当然,批处理脚本有点过时了......;)

© www.soinside.com 2019 - 2024. All rights reserved.