2010-08-09 35 views
2

計算文件名,我想創建一個環境變量來保存文件名類似:Windows批處理文件 - 從當前日期

PREFIX-2010-AUG-09.zip 

我可以親近,如果我用這樣的:

SET filename=PREFIX-%date:~-4,4%-%date:~-7,2%-%date:~0,2%.zip 

結果:

PREFIX-2010-08-09.zip 

但在這種情況下,我得到的每月兩位數(08)。

在Windows批處理文件中是否有任何簡單的技巧可以從數字月份獲取三個字母的月份縮寫(例如08代表「AUG」= 8月)?

更新:這需要在Windows 2008 R2服務器上運行,是的,如果有人能告訴我一個PowerShell解決方案,那也能工作:-)謝謝!

+1

哪個版本的Windows?日期處理在版本之間往往有所不同。 – 2010-08-09 11:44:24

+1

另外,你可以使用PowerShell?我敢打賭,這會讓這更容易。 – 2010-08-09 11:45:40

+0

@Pekka:服務器是Win Server 2008 R2,是的--PowerShell也會工作:-)我需要a)從FTP下載文件,b)解壓縮(這是我需要文件名的地方),和c)恢復它到SQL Server – 2010-08-09 15:15:24

回答

2

這有點像一個查找表:

set month_01=JAN 
set month_02=FEB 
set month_03=MAR 
@rem ... 

set number=02 

for %%a in (month_%number%) do call set month_as_text=%%%%a%% 

echo %month_as_text% 

for%number%值循環用於取消引用匹配的變量名稱。

或者更短:

set number=02 

for /f "tokens=%number%" %%m in ("JAN FEB MAR APR ...") do set month_as_text=%m 

echo %month_as_text% 

編輯:

約翰內斯提出了第1版的簡寫:

set month_01=JAN 
set month_02=FEB 
set month_03=MAR 
@rem ... 

set number=02 

setlocal enabledelayedexpansion 

set month_as_text=!month_%number%!  

echo %month_as_text% 
+1

您可以使用延遲擴展來縮短對'!month_%number%!'的數組訪問權限。 – Joey 2010-08-11 21:59:30

+0

@Johannes:我對此並不確定,也找不到快速參考。但是你仍然需要定義數組,這就是爲什麼我更喜歡第二個(更短)的解決方案。無論如何,我會增加你的消化,謝謝。 – 2010-08-12 07:19:08

+0

是的,第二個選項確實不錯:-) - 不幸的是,這隻適用於這樣一個有限的項目集,因爲afaik標記器只允許最多31個標記。 – Joey 2010-08-12 09:19:09

1

你總是可以做手工數到文本的翻譯,如:

if %MM%==01 set MM=Jan 
if %MM%==02 set MM=Feb 
if %MM%==03 set MM=Mar 
if %MM%==04 set MM=Apr 
etc. 
0

第一個答案是不正確的八月九月。原因是shell將前導零解釋爲八進制,而08和09不是有效的八進制數。您可以通過運行這個命令很容易看到自己這一點:

for /f "tokens=08" %a in ("A B C D E F G H I J") do echo %a 

如果您要更換以上09它也將發生故障08。如果您使用0710,它將起作用。一個工作實現如下:

months=JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC 
:: get the month as a 2-digit number 
set number=%date:~4,2% 
:: remove leading zero 
for /f "tokens=* delims=0" %%a in ("%number%") do set number=%%a 
:: index into array to get month name 
for /f "tokens=%number%" %%m in ("%months%") do set month_as_text=%%m 
:: print month name 
echo %month_as_text%