Batch file 启动特定服务集的批处理脚本

Batch file 启动特定服务集的批处理脚本,batch-file,scripting,Batch File,Scripting,批处理脚本失败。语法不正确。如果服务未运行,则启动它们,并在启动时触发电子邮件 for /f "tokens=1*" %%a in (' sc queryex state^= all ^| findstr /r /c:"DISPLAY_NAME: .*Sm" get state^| Find /v "RUNNING"') do net start "%%b" [编辑] 您能告诉我哪里出了问题吗?我正在检查非活动服务并启动它们,同时启动我生成的电子邮件警报。但它会循环并返回n封邮件。我个人需要

批处理脚本失败。语法不正确。如果服务未运行,则启动它们,并在启动时触发电子邮件

for /f "tokens=1*" %%a in ('
sc queryex state^= all ^| findstr /r /c:"DISPLAY_NAME: .*Sm" get state^| 
Find /v "RUNNING"')
do net start "%%b"
[编辑]

您能告诉我哪里出了问题吗?我正在检查非活动服务并启动它们,同时启动我生成的电子邮件警报。但它会循环并返回n封邮件。我个人需要终止进程…如果服务正在运行,那么我也会收到一封电子邮件

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

与其获取所有服务并尝试查找它们是否正在运行,不如直接从查询中获取
inactive
状态,然后从那里开始:

@for /f "tokens=1*" %%a in ('sc queryex state^=inactive ^| findstr /r /c:"DISPLAY_NAME:.*Sm"') do (
    net start "%%b"
)
注:以上使用括号纯粹是为了可读性,但它们不是必需的,您可以在一行中复制所有内容,如下所示:

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

这是批处理文件中脚本的实际格式吗
(“
错误应该是
('sc queryex…)
此外,您试图在查找后在同一字符串中
获取状态
,这将不起作用。谢谢Gerhard,我需要删除get state吗。我需要知道服务状态是否正在运行,然后不做任何操作,但如果它已停止,则重新启动它。