我在批处理文件中有以下代码:
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是关闭的,我该如何防止它?
答案 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."
肯定提供了非空参数?这是因为处理批处理文件的方式:没有像其他(真正的)编程语言那样的实际函数和子例程;批处理文件旨在从上到下逐行执行整个文件;只有极少数方法可以修改执行流程或直接执行(if
,for
,goto
,call
,&&
,||
) ;不执行您需要明确控制的某些代码部分。所以在你的代码中,在if exist
子句继续执行构成子例程的下一行之后,执行它,因为它是主要部分的一部分。因此,%~1
不再被视为子例程的第一个参数,而是整个批处理脚本的第一个参数;因为你不提供这样的,%~1
扩展为一个空字符串。
您可以简单地证明,如果您通过提供参数来调用批处理文件 - 让我们称之为script.bat
- 从命令提示符窗口(指向包含脚本的目录):
script.bat ##TEST##
这将导致以下日志条目(而不是ECHO is off.
):
##TEST##
再次:将goto :EOF
或exit /B
添加到批处理脚本主要部分的末尾:
:: /* initial code... */
if exist %destination% (
rem do stuff if destination exists.
) else (
call:GenerateErrorLog "%destination% not found."
)
goto :EOF
:GenerateErrorLog
:: /* remaining code... */