2013-03-07 86 views
0

我海创建的BAT文件给日期时间在bat文件和动态路径

@ECHO OFF 
"C:\Program Files\Microsoft SQL Server\100\DTS\Binn\dtexec.exe" /FILE "D:\New folder (2)\xslttosql\SSIS-BSMS\SSIS-BSMS\SSIS-BSMS\Package6.dtsx" /REP P >> "D:\TRX_Value.log" 
exit 

,但我想让它D:\TRX_Value.log路径动态地改变输出,并提供有关文件名的时间信息,如D:\TRX_Value-20130307-144650.log这意味着2012/03/07 14:46:50

那么有可能吗?我应该写什么样的脚本?

+0

是PowerShell的一个选项吗? - 其他任何事情都会容易得多。 JavaScript怎么样? – 2013-03-07 07:54:29

+0

我是BAT新手脚本,那么powershell怎么样?它看起来像命令提示符? – Sabilv 2013-03-07 07:58:20

+1

检查这个答案 - http://stackoverflow.com/questions/1954203/powershell-timestamp-on-file-name/1954384#1954384 – 2013-03-07 08:05:16

回答

3

处理日期在BAT文件中有点棘手。

一个简单的解决方案是使用WMIC本地时间命令返回以方便的方式直接与FOR命令解析它的当前日期和时间。尝试类似这样:

@ECHO OFF 
FOR /F "skip=1 tokens=1-6" %%A IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
    SET /A DT=%%F*10000+%%D*100+%%A 
    SET /A TM=%%B*100+%%C 
    SET FDT=%DT%-%TM% 
) 
ECHO "c:\progs\dtexec" /FILE "d:\fldr\pack.dtsx" /REP P "d:\logs\tr%FDT%.log" 

检查结果和纠正执行线,以满足您的REQ

+0

+1我喜欢看到更多的灵活性的例子'wmic'。它确实是Windows的瑞士军刀。 – rojo 2013-03-07 14:49:22

1

只是因为我喜欢挑战,这里有一个批处理脚本/ JScript的混合脚本会格式化时间戳你想要的方式。用.bat扩展名保存。

@if (@X)==(@Y) @end /* (batch + jscript hybrid script init) 

:: *** Batch script ***** 

@echo off 
setlocal 
for /f %%I in ('cscript /nologo /e:jscript "%~f0"') do set "ts=%%I" 
"C:\Program Files\Microsoft SQL Server\100\DTS\Binn\dtexec.exe" /FILE "D:\New folder (2)\xslttosql\SSIS-BSMS\SSIS-BSMS\SSIS-BSMS\Package6.dtsx" /REP P >> "D:\TRX_Value-%ts%.log" 
exit /b 

:: *** JScript script *****/ 

var d = new Date(); 
WScript.echo(d.getFullYear() + /\d{2}$/.exec('0' + (d.getMonth() + 1)) + /\d{2}$/.exec('0' + d.getDate()) + '-' 
+ /\d{2}$/.exec('0' + d.getHours()) + /\d{2}$/.exec('0' + d.getMinutes()) + /\d{2}$/.exec('0' + d.getSeconds())); 

(dbenham在这种东西的高手。)

1

Echo的日期和时间为2个临时文件,然后将其解析为正确的格式,并利用它们在你的命令。

@ECHO OFF 
Set CURRDATE=%TEMP%\CURRDATE.TMP 
ECHO %DATE% > %CURRDATE% 
Set CURRTIME=%TEMP%\CURRTIME.TMP 
ECHO %TIME% > %CURRTIME% 

Set PARSEDATEARG="eol=; tokens=1,2,3,4* delims=/, " 
Set PARSETIMEARG="eol=; tokens=1,2,3,4,5* delims=:,., " 
For /F %PARSEDATEARG% %%i in (%CURRDATE%) Do SET YYYYMMDD=%%k%%j%%i 
For /F %PARSETIMEARG% %%i in (%CURRTIME%) Do SET HHMMSS=%%i%%j%%k 

"C:\Program Files\Microsoft SQL Server\100\DTS\Binn\dtexec.exe" /FILE "D:\New folder (2)\xslttosql\SSIS-BSMS\SSIS-BSMS\SSIS-BSMS\Package6.dtsx" /REP P >> "D:\TRX_Value-%YYYYMMDD%-%HHMMSS%.log" exit 
+2

这里假设'%date%'的格式是MM/DD/YYYY。根据用户的区域设置,这可能不起作用。 – rojo 2013-03-07 14:45:01

+0

@rojo它实际上假设为DD/MM/YYYY(因为我在英国),但是很好。需要将相关行交换为(For%F%PARSEDATEARG%%%i in(%CURRDATE%))SET YYYYMMDD = %% k %% i %% j'(交换输出中的i和j变量)I假设。 – RichardC 2013-03-07 14:47:38

2

我喜欢PA的建议使用WMIC,但有一个更简单的WMIC实现。

操作系统别名有localDateTime财产几乎确切格式你想:

YYMMDDhhmmss.ffffff-zzz

其中ffffff是小数秒,zzz是时区信息。简单的子串操作提供了所需的日期和时间格式。

@echo off 
setlocal 
set "ts=" 
for /f "skip=1" %%A in ('wmic os get localDateTime') do if not defined ts set "ts=%%A" 
... your exe call ... >>"D:\TRX_Value-%ts:~0,8%-%ts:~8,6%.log" 
+0

整洁!但是,如果将'wmic'的输出格式化为列表,则不必确保'%ts%'未被设置或检查是否未定义。 'for/f“tokens = 2 delims ==”%%我在('wmic os get localdatetime/format:list')do set“ts = %% I”'无论如何,'wmic os get localdatetime'是一个优秀的发现! – rojo 2013-03-07 19:22:41