Ant*_*ean 9 windows parsing cmd batch-file echo
我有一个批处理文件,可以在本地或在构建服务器上运行,以做一些有趣的工作.在本地计算机上,我希望@ECHO OFF您的控制台没有充满调试字符串.在构建服务器上,我宁愿@ECHO ON这样可以调查失败.
如果存在特殊的环境变量(TEAMCITY_PROJECT_NAME),则可以确定构建服务器上下文.所以,我以为我可以做点什么
IF DEFINED TEAMCITY_PROJECT_NAME @ECHO ON ELSE @ECHO OFF
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用,我得到的IF声明与其他一切相呼应......任何想法?
RBe*_*eig 15
该命令实际上没有命名@echo.这@是一个在语句开头有效的可选标志,表示该语句的echo被抑制.因此,使用@on echo命令的每个引用都将隐藏echo命令本身,但不会隐藏命令本身if之前的命令.
但实际上导致命令无法按预期运行的问题是第一个echo命令会将该行上其余的标记作为其参数进行篡改,因此该else echo off部分不会被解释CMD.由于CMD.EXE默认回显它打印if命令,然后执行单个echo命令或什么都不执行.由于在@语句的开头是确实有意义,因此if不打印echo命令.
通常,解决方案是使用括号来分隔命令边界.但是,由于默认情况下echo是打开的,如果TEAMCITY_PROJECT没有定义,你真的只想抑制它,我们可以直接说.
@IF NOT DEFINED TEAMCITY_PROJECT_NAME ECHO OFF
Run Code Online (Sandbox Code Playgroud)
我@在开头只留下一个来抑制此行的回声,因此该行不会出现在服务器的日志中.
回声状态也适用于交互式会话.键入echo off在一个交互式CMD会话提示将导致其停止显示提示.如果没有预料到,这有点令人不安.键入echo on将恢复正常行为.
(为了清楚起见,我已经编辑了前面的部分,并添加了此部分以尝试记录实际发生的情况.)
在CMD.EXE该解释.BAT和.CMD脚本,提供交互式命令提示符现代的Windows程序,同时有效地被无证令人惊讶的是有据可查的.我试图寻找一份官方文件来解释该标志具有这种影响以及确切地使用它的地方,但这种尝试基本上没有成功.
从实验中可以清楚地看出,如果at符号显示为命令的第一个非空白字符,则会对其进行解析和解释.我试图通过使用上面的"开头的陈述"来表达这一点.
据我所知,CMD的语言没有正式的语法.但是我们从CDM本身的文档(类型cmd /?到提示)以及if /?其他"有趣"内置命令的内置帮助文本中知道,当CMD解析其源文本时,遵循规则.
命令的开头似乎位于一行的开头,或者在一个开括号之后if,之后或之后的条件else之后(.一旦识别出at-sign,它就适用于该命令的(大部分)余额.
自己尝试下面的批处理文件,并使用移动at符号进行游戏,你很快就会感觉到规则很难精确地说明:
rem this remark will echo
@rem this one will not
@ rem neither will this
@rem nor this one
@rem the if command (and else) will echo, but not either echo command
if exist q17241089.bat ( @ echo saw q17241089.bat ) else @ echo foo
if not exist q17241089.bat ( @ echo no q17241089.bat ) else @ echo bar
@ rem none of the following command is echoed
@ if exist q17241089.bat ( @ echo saw q17241089.bat ) else @ echo spam
Run Code Online (Sandbox Code Playgroud)
在我的Win 7 Pro上运行时,我看到:
C...>
C...>q17241089.bat
C...>rem this remark will echo
C...>if exist q17241089.bat () else
saw q17241089.bat
C...>if not exist q17241089.bat () else
bar
saw q17241089.bat
C...>
Run Code Online (Sandbox Code Playgroud)
与BAT文件的大部分细节一样,在您划伤的任何表面下都有一个谜.