Batch file 在.bat文件中传递文件名变量

Batch file 在.bat文件中传递文件名变量,batch-file,Batch File,我的代码如下 set log_file = Automation_log.log call :main > %log_file% exit /b :main call:main>%log\u file%生成语法错误 您可能想知道为什么我不将日志文件名直接传递到>,, 我这样做是因为我在文件名中输入了日期和时间,它将得到定制 通过跟随注释,下面是我的代码的外观 @echo off For /f "tokens=2-4 delims=/ " %%a in ('date /t') do

我的代码如下

set log_file = Automation_log.log

call :main > %log_file%
exit /b
:main

call:main>%log\u file%生成语法错误

您可能想知道为什么我不将日志文件名直接传递到>,, 我这样做是因为我在文件名中输入了日期和时间,它将得到定制

通过跟随注释,下面是我的代码的外观

@echo off

For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b)

set log_file = Automation_Log__%mydate%_%mytime%.log

call :main > "%log_file%"
exit /b
:main

这也会导致错误,因为系统找不到指定的路径。

这是您的脚本,其中包含正确定义的变量,使用非本地/PC相关的方法获取日期和时间。本例只需使用内容
Test
创建文本文件即可:

@Echo关闭
设置“日志文件=”
对于/F“Tokens=1-6Delims=/:”%%A In('RoboCopy/NJH/L“\\\\\”Null)
)如果未定义日志文件,则不设置“日志文件=自动化日志”%%A%%B%%C%%D%%E\%%F”
调用:Main>%log\u文件%
后藤:EOF
:Main
回声测试
退出/B

您没有指明预期的日期和时间格式,因此我使用了
yyyyMMdd\u hhmmss
。如果您希望更改,请重新排列第4行的顺序,其中
%A
=
yyyy
%B
=
MM
%C
=
dd
%D
=
hh
%E
%E
MM
%F
ss
ss

尝试设置日志文件,然后是
Call:main>“%log\u file%”
。当前,您有一个名为
log\u file
的变量,字符串值为
Automation\u log.log
。使用您的注释,下面是代码,但在@echo off For/f“tokens=2-4 delims=/”('date/t')do中的%%a(set mydate=%%c-%%a-%%b)For/f“tokens=1-2 delims=/:“%%a in(“%TIME%”)do(set mytime=%a%%b)set“log\u file=Automation\u log\u%mydate%\u%mytime%.log”调用:main>%log\u file%“退出/b:main您没有遵循我给出的建议,除非您这样做,否则脚本将仍然存在问题。此外,使用
Date/T
%TIME%
只能保证在您自己电脑的特定登录下正确无误。我想进一步介绍@Compo的评论。您得到的错误是因为没有定义没有尾随空格的
log\u文件
。因此,
call:main>%log\u file%
产生错误,因为未定义
log\u file
时,命令变为
call:main>
,这是无效的。在CMD中,set命令中的
=
周围不需要空格。要修复错误,您只需设置日志文件=自动化日志。日志在
=
两侧没有空格。非常好,谢谢。很抱歉延迟,我是OOO。我希望在文件名中获得时间秒,因为有可能运行其他进程来生成日志。如果在:Main之前有Exit/B行,会发生什么?我将执行接下来的几个步骤,这些步骤需要将输出记录在此文件中。此外,一旦我的过程结束,我需要阅读同一个日志文件和searc for'Failed:0',然后发送一封电子邮件。@JBJ,我已将我的答案更改为现在在日志文件名中包含秒数。谢谢,收到了,我尝试了类似的方法,因为我现在能够理解更多。我有一个包含如下行的日志文件"测试总数:1。通过:0。失败:1。已跳过:0。“\n如果失败:包含0以外的任何数字,则我需要以电子邮件的形式发送一封邮件,并将日志文件作为附件。