首页 > 解决方案 > 如何在 bat/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

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

运行结果 我做错了什么?

标签: windowsbatch-fileinputcmd

解决方案


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

在这种情况下,有一个更简单的解决方法,即调用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

推荐阅读