Batch file .bat文件中的动态变量,用于根据当前日期创建日志

Batch file .bat文件中的动态变量,用于根据当前日期创建日志,batch-file,Batch File,我是SAS程序用户,为任务调度编写了以下.bat文件。我想导出文件名为%date%\u log.log的日志文件。由于我不熟悉编写.bat脚本(我希望日期格式为ddmmmyyyy) 对于创建环境变量,我认为我可以执行以下操作 @echo off set ddmmyyyy=%date:=~4, 2%%date:=~7, 2%%date:=~10, 4% set logfile= "C:\log\log_%ddmmyyyy%.log" 虽然我不知道如何把它放在-Log语句中。另外,我更喜欢d

我是SAS程序用户,为任务调度编写了以下.bat文件。我想导出文件名为%date%\u log.log的日志文件。由于我不熟悉编写.bat脚本(我希望日期格式为ddmmmyyyy)

对于创建环境变量,我认为我可以执行以下操作

@echo off   
set ddmmyyyy=%date:=~4, 2%%date:=~7, 2%%date:=~10, 4%
set logfile= "C:\log\log_%ddmmyyyy%.log"
虽然我不知道如何把它放在-Log语句中。另外,我更喜欢ddmmmyyyy格式而不是ddmmyyy格式

REM Reference
    REM commands split over multiple lines ^ 
    REM Commends in .bat file REM

"C:\Program Files\SASHome\SASFoundation\9.3\sas.exe"^
 -CONFIG "C:\sasv9.cfg"^
 -AUTOEXEC "C:\AUTOEXEC.sas"^
 -SYSIN "C:\script.sas"^
 -LOG %logfile%

在Windows批处理中处理日期是一件痛苦的事情。您对%DATE%的使用不可靠,因为它是特定于区域设置的。即使在英语国家,不同的Windows机器也使用不同的格式。因此,在您的计算机上运行的批处理脚本可能无法在其他计算机上运行

您可以使用WMIC OS GET LOCALDATETIME以YYYYMMDDhhmmss.ssssss-zzz格式可靠地获取时间戳。您可以使用查找值将月份号转换为月份缩写

例如:

@echo off
setlocal enableDelayedExpansion
set "months= 01:Jan 02:Feb 03:Mar 04:Apr 05:May 06:Jun 07:Jul 08:Aug 09:Sep 10:Oct 11:Nov 12:Dec"
set "ts="
for /f "skip=1 delims=" %%A in ('wmic os get localdatetime') do if not defined ts set "ts=%%A"
set "yyyy=%ts:~0,4%"
set "mm=%ts:~4,2%"
set "dd=%ts:~6,2%"
for /f %%A in ("!months:*%mm%:=!") do set "mon=%%A"
set "logfile=C:\log\log_%dd%%mon%%yyyy%.log"

"C:\Program Files\SASHome\SASFoundation\9.3\sas.exe"^
 -CONFIG "C:\sasv9.cfg"^
 -AUTOEXEC "C:\AUTOEXEC.sas"^
 -SYSIN "C:\script.sas"^
 -LOG %logfile%
但我有一个更简单的建议。你可以用我的工具。它是纯脚本(混合JScript/批处理),从XP开始在任何Windows机器上本机运行。您的解决方案可以简单到

@echo off
setlocal
call GetTimestamp -f "C:\log\log_{dd}{mth}{yyyy}.log" -r logfile

"C:\Program Files\SASHome\SASFoundation\9.3\sas.exe"^
 -CONFIG "C:\sasv9.cfg"^
 -AUTOEXEC "C:\AUTOEXEC.sas"^
 -SYSIN "C:\script.sas"^
 -LOG %logfile%

注意-我个人不喜欢在文件名中使用DDMMMYYYY,因为它不按时间顺序排序。我更喜欢YYYYMMDD,或者YYYY-MM-DD.

你指的是月份的缩写,比如一月的缩写吗?嗨@dbenham是的。例如,2015年7月13日的yyyymmdd很容易与yyyyddmm混淆。