ECHO不会附加到文本文件中

时间:2016-10-05 01:43:34

标签: batch-file command-line cmd

我在批处理文件中有以下代码:

rem capture the date/time(right down to the second) and then assign it to a variable
set yy=%date:~-4%
set dd=%date:~-7,2%
set mm=%date:~-10,2%
set newdate=%dd%%mm%%yy%_%Time:~0,8%
set newdate=%newdate::=%
set foldername=svetlana_backup_%newdate%
set foldername=%foldername: =%

set destination=R:\Backup

if exist %destination% (
    rem do stuff if destination exists.
) else (
    call:GenerateErrorLog "%destination% not found."
)


:GenerateErrorLog
echo %~1 >> error_log_%foldername%.txt
goto:eof

它生成以下文本文件:

R:\Backup not found. 
ECHO is off.

为什么打印ECHO是关闭的,我该如何防止它?

2 个答案:

答案 0 :(得分:3)

由于值%~1为空,因此echo会报告其状态。

要解决此问题:使用echo(代替echo[Space] - (不参与嵌套例程的括号计数,但已被发现禁止echo报告空参数{quirk}

答案 1 :(得分:1)

正如某些@Squashman已经指出comments,您需要在脚本的主要部分完成后无意中阻止执行子例程: GenerateErrorLog

@Magoo answer已经解释了ECHO is off.消息的技术原因。

但是为什么%~1为空,尽管调用命令行call:GenerateErrorLog "%destination% not found."肯定提供了非空参数?这是因为处理批处理文件的方式:没有像其他(真正的)编程语言那样的实际函数和子例程;批处理文件旨在从上到下逐行执行整个文件;只有极少数方法可以修改执行流程或直接执行(ifforgotocall&&||) ;不执行您需要明确控制的某些代码部分。所以在你的代码中,在if exist子句继续执行构成子例程的下一行之后,执行它,因为它是主要部分的一部分。因此,%~1不再被视为子例程的第一个参数,而是整个批处理脚本的第一个参数;因为你不提供这样的,%~1扩展为一个空字符串。

您可以简单地证明,如果您通过提供参数来调用批处理文件 - 让我们称之为script.bat - 从命令提示符窗口(指向包含脚本的目录):

script.bat ##TEST##

这将导致以下日志条目(而不是ECHO is off.):

##TEST##

再次:将goto :EOFexit /B添加到批处理脚本主要部分的末尾:

:: /* initial code... */
if exist %destination% (
    rem do stuff if destination exists.
) else (
    call:GenerateErrorLog "%destination% not found."
)
goto :EOF

:GenerateErrorLog
:: /* remaining code... */