【问题标题】:ECHO is off appended to text fileECHO 已关闭附加到文本文件
【发布时间】:2016-10-05 01:43:33
【问题描述】:

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

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 is off,如何防止?

【问题讨论】:

  • IF ELSE 子句的最后一个括号之后放置一个GOTO :EOF。但是我看不出有任何理由需要调用标签来将其回显到日志文件中。为什么不将 echo 放在 ELSE 子句中?
  • @Squashman - 批处理文件比我在这里发布的要大得多。我把不相关的代码拿出来贴出来。有很多 else 子句会回显错误,所以我决定创建一个函数。
  • 所以你明白你的所有函数都应该在你的批处理文件的末尾,并且你应该有一个 GOTO :EOFEXIT /B 作为你所有函数之前的行,以便它退出批处理文件而不尝试再次执行所有功能?
  • @Squashman - 当然可以!

标签: batch-file command-line cmd


【解决方案1】:

因为%~1 的值是空的,所以echo 报告它的状态。

解决方法:使用 echo( 代替 echo[Space] - ( 不参与嵌套例程的括号计数,但已发现抑制 echo 报告空参数 {怪癖}

【讨论】:

  • 真是个怪癖!刚刚收藏!
  • 从技术上讲这就是原因,但真正应该使用的是GOTO :EOFIF..ELSE 子句之后,这样就不会执行echo %1 两次。
【解决方案2】:

正如@Squashman 已经被一些comments 指出的那样,您需要防止在脚本的主要部分完成后无意执行子程序: GenerateErrorLog

ECHO is off. 消息的技术原因已经在@Magooanswer 中进行了解释。

但是为什么%~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... */

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多