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吗。我需要知道服务状态是否正在运行,然后不做任何操作,但如果它已停止,则重新启动它。