Пакетный скрипт для отправки электронного письма - PullRequest
0 голосов
/ 06 февраля 2019

Пожалуйста, дайте мне знать, что я делаю неправильно в моем коде.Я пытаюсь проверить набор Сервисов, начиная с определенного набора имен.И запуск электронной почты, если служба находится в состоянии остановки.Я сделал петлю, где в нем будет проходить.Но я не могу закончить этот цикл.

setlocal

:loop
@for /f "tokens=1*" %%a in ('sc queryex state^=inactive ^| findstr /r 
/c:"DISPLAY_NAME:.*ASP"') do net start "%%b" && goto :mail 

:mail
set Port=25
set SSL=False
set From="abc@gmail.com"
set To="abc@gmail.com"
set Subject="Subject line"
set Body="Email Body in one line"
set SMTPServer="smtp.gmail.com"
set User="abc@gmail.com"
set Pass="1234567"


  if "%~7" NEQ "" (
   set From="%~1"
 set To="%~2"
 set Subject="%~3"
 set Body="%~4"
 set SMTPServer="%~5"
 set User="%~6"
 set Pass="%~7"
 set fileattach="%~8"
 )

set "vbsfile=%temp%\email-bat.vbs"
del "%vbsfile%" 2>nul
set cdoSchema=http://schemas.microsoft.com/cdo/configuration
echo >>"%vbsfile%" Set objArgs       = WScript.Arguments
    echo >>"%vbsfile%" Set objEmail      = CreateObject("CDO.Message")
echo >>"%vbsfile%" objEmail.From     = %From%
echo >>"%vbsfile%" objEmail.To       = %To%
    echo >>"%vbsfile%" objEmail.Subject  = %Subject%
echo >>"%vbsfile%" objEmail.Textbody = %body%
if exist %fileattach% echo >>"%vbsfile%" objEmail.AddAttachment                     
 %fileattach%
    echo >>"%vbsfile%" with objEmail.Configuration.Fields
echo >>"%vbsfile%"  .Item ("%cdoSchema%/sendusing")        = 2 ' not local,         
smtp
 echo >>"%vbsfile%"  .Item ("%cdoSchema%/smtpserver")       = %SMTPServer%
  echo >>"%vbsfile%"  .Item ("%cdoSchema%/smtpserverport")   = %port%
  echo >>"%vbsfile%"  .Item ("%cdoSchema%/smtpauthenticate") = 1 ' cdobasic
 echo >>"%vbsfile%"  .Item ("%cdoSchema%/sendusername")     = %user%
 echo >>"%vbsfile%"  .Item ("%cdoSchema%/sendpassword")     = %pass%
 echo >>"%vbsfile%"  .Item ("%cdoSchema%/smtpusessl")       = %SSL%
 echo >>"%vbsfile%"  .Item ("%cdoSchema%/smtpconnectiontimeout") = 30
 echo >>"%vbsfile%"  .Update
 echo >>"%vbsfile%" end with
 echo >>"%vbsfile%" objEmail.Send

  cscript.exe /nologo "%vbsfile%"

  echo email sent (if variables were correct)
  del "%vbsfile%" 2>nul
  goto :loop

1 Ответ

0 голосов
/ 07 февраля 2019
@echo off
setlocal

rem Count variable for inactive services.
set "ServicesInactive=0"

rem Increment count variable to number of start services.
for /f "tokens=1*" %%a in ('sc queryex state^=inactive ^| findstr /r
/c:"DISPLAY_NAME:.*ASP"') do net start "%%b" && set /a "ServicesInactive+=1"

rem Send email if count is greater than zero.
if %ServicesInactive% gtr 0 goto :mail
goto :endmail

:mail
set Port=25
set SSL=False
set From="abc@gmail.com"
set To="abc@gmail.com"
set Subject="Subject line"
set Body="Email Body in one line"
set SMTPServer="smtp.gmail.com"
set User="abc@gmail.com"
set Pass="1234567"

if "%~7" NEQ "" (
    set From="%~1"
    set To="%~2"
    set Subject="%~3"
    set Body="%~4"
    set SMTPServer="%~5"
    set User="%~6"
    set Pass="%~7"
    set fileattach="%~8"
)

set "vbsfile=%temp%\email-bat.vbs"
set cdoSchema=http://schemas.microsoft.com/cdo/configuration

(
    echo Set objArgs       = WScript.Arguments
    echo Set objEmail      = CreateObject("CDO.Message")
    echo objEmail.From     = %From%
    echo objEmail.To       = %To%
    echo objEmail.Subject  = %Subject%
    echo objEmail.Textbody = %body%
    if exist %fileattach% echo objEmail.AddAttachment %fileattach%
    echo with objEmail.Configuration.Fields
    echo  .Item ("%cdoSchema%/sendusing")        = 2 ' not local,smtp
    echo  .Item ("%cdoSchema%/smtpserver")       = %SMTPServer%
    echo  .Item ("%cdoSchema%/smtpserverport")   = %port%
    echo  .Item ("%cdoSchema%/smtpauthenticate") = 1 ' cdobasic
    echo  .Item ("%cdoSchema%/sendusername")     = %user%
    echo  .Item ("%cdoSchema%/sendpassword")     = %pass%
    echo  .Item ("%cdoSchema%/smtpusessl")       = %SSL%
    echo  .Item ("%cdoSchema%/smtpconnectiontimeout") = 30
    echo  .Update
    echo end with
    echo objEmail.Send
) > "%vbsfile%"

cscript.exe /nologo "%vbsfile%"

echo email sent (if variables were correct)
del "%vbsfile%" 2>nul
:endmail

Переменная ServicesInactive имеет значение от set до 0, и каждая служба, запущенная в цикле for, будет увеличивать ServicesInactive на 1.

После forцикл завершен, если ServicesInactive больше 0, то по команде goto :email будет отправлено электронное письмо, в противном случае будет goto :endmail.

Перемещено эхо между скобками, что делает запись ввременный файл VBS немного аккуратнее и эффективнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...