批处理:为什么附加文本文件会写“ECHO 已关闭”?

Her*_*tik 5 cmd batch-file io-redirection

所以我写了一个批处理,其中有一些代码来检查它通过读取文本文件运行了多少次,然后将新的增加的数字写回到该文本文件中。

@ECHO OFF
for /f "delims=" %%x in (TimesRun.txt) do set Build=%%x
set Build=%Build%+1
@echo Build value : %Build%
echo %Build%>>TimesRun.txt
Pause
Run Code Online (Sandbox Code Playgroud)

这确实附加了文本文件,但它添加了“1+1”。傻我!我忘了使用 /a 开关来启用算术运算!但是当我相应地更改代码时......

@ECHO OFF
for /f "delims=" %%x in (TimesRun.txt) do set Build=%%x
set /a Build=%Build%+1
@echo Build value : %Build%
echo %Build%>>TimesRun.txt
Pause
Run Code Online (Sandbox Code Playgroud)

......发生了一些有趣的事情:ECHO 关闭,而不是附加我的文件写在控制台上。现在,我知道这通常发生在ECHO没有文本或空变量的情况下。我添加了第一个,@echo Build value : %Build%专门查看变量Build是否为空;事实并非如此,并且计算是正确进行的。我已经想通了

>>TimesRun.txt (echo %Build%)
Run Code Online (Sandbox Code Playgroud)

确实带来了预期的结果。我还是不明白为什么

echo %Build%>>TimesRun.txt
Run Code Online (Sandbox Code Playgroud)

不,但是。我错过了什么?

asc*_*pfl 6

您无意中指定了重定向句柄。


重定向允许您指定某个句柄来定义要重定向的内容:

0     = STDIN  (keyboard input)
1     = STDOUT (text output)
2     = STDERR (error text output)
3 ~ 9 = undefined
Run Code Online (Sandbox Code Playgroud)

对于输入重定向操作符<0默认使用handle ;对于输出重定向运算符>>>,默认句柄是1

您可以通过在重定向运算符前放置一个数字来显式指定句柄;例如2>定义重定向错误文本输出。


在您的echo命令行中,您无意中执行了此操作,when%Build%是单个数字,1例如:

echo 1>>TimesRun.txt
Run Code Online (Sandbox Code Playgroud)

为避免这种情况,您有以下选择:

  1. 要反转语句以便重定向定义首先出现:

    >>TimesRun.txt echo %Build%
    
    Run Code Online (Sandbox Code Playgroud)

    这是最通用和最安全的重定向方式。

  2. 要将重定向的命令括在括号中:

    (echo %Build%)>>TimesRun.txt
    
    Run Code Online (Sandbox Code Playgroud)

    这也可以安全地工作。

  3. 将 aSPACE放在重定向运算符的前面:

    echo %Build% >>TimesRun.txt
    
    Run Code Online (Sandbox Code Playgroud)

    这也有效,但额外SPACE的包含在echo.

另请参阅这篇很棒的文章:cmd.exe 重定向操作符 order 和 position