windows - 如何在 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
但是当我启动它时,什么都没有:
解决方案
您的变量%var%
未显示的原因是因为它SET
位于带括号的代码块内。防止这种情况发生的常用方法是启用延迟扩展,并将%
字符替换为!
's。
在这种情况下,有一个更简单的解决方法,即调用CALL
命令:
CALL ECHO ENTERED "%%var%%"
我决定将此答案发布为对我的评论的更新,因为:
SC QUERYX "%SvcName%"
应该是SC QUERY "%SvcName%"
。- 您可以使用单个
FIND
甚至FINDSTR
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
推荐阅读
- c++ - 使数组结构看起来像结构数组的 std::vector 包装器
- java - 如何在 java 中使用 ObjectMapper 从 JSON 中获取单个键值
- r - 在 ggplot2 中格式化 Geom_Bar
- apache-kafka - 未找到主题融合 kafka 模式注册表错误代码“:40401,”消息
- sql - 查找过去的日期,始终基于今天的日期
- docker - 如何在 Dockerfile 中安装 Web 服务增强 (WSE) 3.0
- machine-learning - 流失预测中的特征选择
- php - 通过来自 axios 的补丁请求上传文件时出现问题
- r - r中的格式更改
- opencv - 如何获得一组点的边界矩形?