我尝试编写一个脚本,但运行此脚本后我得到“其他是意外的”。这是脚本:
@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
我选择这个问题是为了看看我是否能解决它。
我的测试环境是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 脚本时才会打印出来。为了成功检查,必须完成以下步骤:
当然,批处理脚本有点过时了......;)