如何使用if条件在批处理文件中运行多个命令

时间:2015-09-01 10:11:26

标签: windows batch-file

我是新手在Windows中创建批处理文件,我正在尝试创建一个批处理文件来检查Windows状态下的服务,如果服务处于运行状态,那么我正在尝试执行另一个命令来检查状态但是我不能获取第二个命令的输出。

使用%ERRORLEVEL%检查查询状态。

以下是我在批处理文件中的代码:

@echo off
sc query "MpsSvc" | find "RUNNING"
echo "%ERRORLEVEL%"
if "%ERRORLEVEL%" EQU "0" (
     netsh advfirewall show currentprofile state | find "ON"
if "%ERRORLEVEL%" EQU "0" (
     echo firewall is already enabled
)
if "%ERRORLEVEL%" NEQ "0" (
     echo going to enable firewall
)
)
if "%ERRORLEVEL%" NEQ "0" (
     echo firewall service is not running
)
pause

当我尝试运行我的批处理文件时,我获得了命令echo firewall is already enabled的%ERRORLEVEL%只能获得另一个命令echo firewall is already enabled

有谁可以告诉我我做了什么错误?

3 个答案:

答案 0 :(得分:2)

如另一个答案中所述,您的近似问题是嵌套%ERRORLEVEL%中的早期变量扩展,但对于错误级别测试,不使用if not errorlevel 1 (... ,请使用< / p>

if errorlevel 5...

内置语法{​​{1}}测试错误等级 5或更高
因此,如果errorlevel正好为0,则not errorlevel 1为真。

答案 1 :(得分:1)

您需要启用(和使用)delayed expansion

  

延迟扩展将导致变量在执行时扩展   时间而不是在解析时,这个选项打开了   SETLOCAL命令。当延迟扩展有效时,变量可以是   除了正常!variable_name!

之外,还使用%variable_name%引用
@ECHO OFF
SETLOCAL EnableExtensions EnableDelayedExpansion
sc query "MpsSvc" | find "RUNNING"
echo sc "%ERRORLEVEL%"
if "%ERRORLEVEL%" EQU "0" (
  netsh advfirewall show currentprofile state | find "ON"
  echo netsh "!ERRORLEVEL!"
  if "!ERRORLEVEL!" EQU "0" (
    echo firewall is already enabled
  ) else (
    echo going to enable firewall
  )
) else (
  echo firewall service is not running
)
pause

资源(必读):

答案 2 :(得分:0)

使用goto

if somecondition goto label1
rem some script if somecondition FALSE
goto label2
:label1
rem some script if somecondition TRUE
:label2

call batch.bat(包括多个批处理文件中的所有复杂脚本,并使用call执行它并返回主批处理文件)