2013-03-07 71 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