当检查这个Windows批处理/ CMD文件(来自Chocolatey源的RefreshEnv.cmd )时,我碰到以下代码行:
echo/@echo off >"%TEMP%\_env.cmd"
上面创build文件_env.cmd与内容“@echo off”。
斜杠在“echo /”中做了什么? 如果我省略了斜线,结果文件完全一样。
我在Windows 7上。
首先,对于你的命令行来说,不管你是写echo/@echo off
还是echo @echo off
都没有echo/@echo off
。
紧接在echo
命令之后的一个字符有时用来回显一个空行,因为没有任何参数的echo
返回一个消息,比如ECHO is on|off.
。 一个很常见的方法就是写echo.
,但是如果有一个叫做echo.
的文件,这可能会失败echo.
(没有文件扩展名)在当前的工作目录,然后会被无意地执行。
通常, cmd
有以下字符,它们在命令行中分隔标记,如命令及其参数: SPACE , TAB ,, ;
, =
和非中断空间(代码0xFF
)。 最常用的令牌分隔符(我强烈推荐)是一个空格 。 多个相邻的分隔符被视为一个单独的分隔符。
还有更多的人物似乎将命令与其参数分开: .
, :
, /
, \
, [
, ]
, +
和(
尽管这些字符似乎成为第一个参数的一部分,然后(尝试type+file.txt
的内容,而不是file.txt
。)
然而, echo
似乎行为不同,因为并不是所有的标记分隔符都是相同的处理方式,前面提到的将命令与其参数分离的附加字符不作为参数的一部分。 这是echo
如何表现:
echo
后面没有任何内容,或者后跟一个SPACE ,一个TAB或一个非中断空格,或者由多个这样的字符组成的字符串返回ECHO is on|off.
; echo
之后是a,,a ;
或an =
返回一个空行; echo
之后是a,,a ;
或an =
,后跟一个或多个标记分隔符返回这些标记分隔符; echo
后跟一个标记分隔符,后跟一个至少包含一个SPACE , TAB和非空格之外的字符的字符串,返回该字符串; echo
之后.
, :
, /
, \
, [
, ]
, +
或(
返回一个空行; echo
之后.
, :
, /
, \
, [
, ]
, +
或(
其他任何内容,甚至是标记分隔符,都会返回所有内容; echo
之后.
如果有一个名为echo.
的文件, [
, ]
或+
失败echo.
,分别为echo[
, echo]
和echo+
; echo
后跟\
或:
也可能由于类似(但更复杂)的路径冲突而失败; echo
跟随/
不能由于路径冲突失败,但如果下面的文本开始,它会失败?
,因为/?
被注意到,所以帮助文本显示在控制台而不是给定的文本; echo
(
后面紧跟着一个任意文本,安全地返回所说的任意文本; 所以唯一安全的方法就是使用echo(
。为了返回一个空行,我更喜欢使用echo/
,因为它看起来不像echo(
。
DosTips上有一个关于如何通过echo
命令安全地返回一个空行的方法,以及如何安全地使用echo
命令。
关注那些像^
, &
, %
!
, (
, )
, <
, >
和|
需要正确转义才能被echo
正确返回; 但是这是必要的,因为命令解释器cmd
并且与echo
命令无关。