如何在bat / cmd中设置变量?

时间:2018-08-03 09:20:06

标签: windows batch-file input cmd

我写了可以在某些服务中使用的bat文件,并尝试使用输入参数在其中实现菜单,但是无法读取此参数。有代码:

@ECHO OFF
SET SvcName=QTCE
SC QUERYEX "%SvcName%" | FIND "STATE" | FIND /v "RUNNING" > NUL && (
    ECHO %SvcName% is not running 
    ECHO.
    ECHO Don't worry ! We start it now! 
    net start QSERVER
    net start QTCE
    ECHO.
    ECHO "%SvcName%" is started
) || (

ECHO "%SvcName%" is running 
ECHO.
ECHO What do you whant i do ? 
ECHO.
ECHO 1 - RESTART QTCE
ECHO 2 - STOP QTCE
ECHO.
SET /p var="Type 1, 2 then press ENTER: "
ECHO ENTERED "%var%"

ECHO Done! Yo're welcome ..    
)
pause

但是当我启动它时,什么也没有:

result fo running 我做错了什么?

2 个答案:

答案 0 :(得分:2)

未显示变量%var%的原因是因为变量SET位于括号代码块中。防止这种情况发生的通常方法是启用延迟扩展,并将%字符替换为!

在这样的单个情况下,有一个更简单的解决方法,即调用CALL命令:

CALL ECHO ENTERED "%%var%%"

我决定发布此答案作为对我的评论的更新,因为:

  1. SC QUERYX "%SvcName%"应该是SC QUERY "%SvcName%"
  2. 您可以使用一个FIND甚至是FINDSTR
  3. 当您已经在使用NET时,无需使用SC

使用FIND

@ECHO OFF
SET "SvcName=QTCE"
SC QUERY | FIND /I "%SvcName%" > NUL && (
    ECHO %SvcName% is running
    ECHO=
    ECHO What do you want to do?
    ECHO=
    ECHO 1 - RESTART QTCE
    ECHO 2 - STOP QTCE
    ECHO=
    SET /P "var=Type 1, 2 then press ENTER: "
    CALL ECHO ENTERED "%%var%%"
    ECHO Done! You're welcome ..
) || (
    ECHO %SvcName% is not running
    ECHO=
    ECHO Don't worry! We'll start it now!
    IF /I "%SvcName%"=="QTCE" SC START QSERVER
    SC START %SvcName%
    ECHO=
    ECHO "%SvcName%" is started
)
PAUSE

要使用FINDSTR而不是将上面的行3替换为:

SC QUERY "%SvcName%" | FINDSTR /RC:"STATE.*: 4" >NUL && (

注意
以上内容不能解决代码中的其他问题,可以启动尚未检查状态的服务,并通知最终用户无需检查即可启动服务它有。另外,取决于您如何扩展代码,您只能重新启动已暂停的服务,而不能等待继续。


编辑
出于礼貌,根据您的评论和我的回答,这是脚本的基本重组,它避免了使用延迟扩展的需要,而不是SET在带括号的代码块中使用%var%

@ECHO OFF
SET "SvcName=QTCE"

SC QUERY | FIND /I "%SvcName%" > NUL || GOTO SVCSTART

ECHO %SvcName% is running
ECHO=
ECHO What do you want to do?
ECHO=
ECHO 1 - RESTART %SvcName%
ECHO 2 - STOP %SvcName%
ECHO=
SET /P "var=Type 1, 2 then press ENTER: "
ECHO ENTERED "%var%"
ECHO Done! You're welcome ..
PAUSE
GOTO :EOF

:SVCSTART
ECHO %SvcName% is not running
ECHO=
ECHO Don't worry! We'll start it now!
IF /I "%SvcName%"=="QTCE" SC START QSERVER
SC START %SvcName%
ECHO=
ECHO "%SvcName%" is started
PAUSE
GOTO :EOF

答案 1 :(得分:0)

就是这样!

CALL ECHO ENTERED "%%var%%"

感谢所有人