2010-08-12 137 views
27

如何從Windows cmd腳本中獲取當天的月份和年份?我需要將每個值都變成一個單獨的變量。如何從Windows cmd.exe腳本獲取當天的月份和年份?

+1

http://stackoverflow.com/questions/203090/how-to-get-current-datetime-on-windows-command-line-in-a -suitable-format-for-usi – jwsample 2010-08-12 23:12:57

+0

我不明白這應該如何工作。如果我在鏈接處執行腳本並打印結果,它只是給我Thu_08_12_2010_161902_52 – Mossen 2010-08-12 23:22:48

回答

15

工作區域獨立的腳本的變體。把它放在一個擴展名爲.cmd的文本文件中並運行。

::: Begin set date 

for /f "tokens=1-4 delims=/-. " %%i in ('date /t') do (call :set_date %%i %%j %%k %%l) 
goto :end_set_date 

:set_date 
if "%1:~0,1%" gtr "9" shift 
for /f "skip=1 tokens=2-4 delims=(-)" %%m in ('echo,^|date') do (set %%m=%1&set %%n=%2&set %%o=%3) 
goto :eof 

:end_set_date 
::: End set date 

echo day in 'DD' format is %dd%; month in 'MM' format is %mm%; year in 'YYYY' format is %yy% 

變量%DD%,%毫米%和%YY%,將分別保持一天( 'DD' 格式),月( 'MM' 格式),並在今年( 'YYYY' 格式)。

+2

還沒有測試過這個,但我懷疑它也是高度依賴本地化的。 – BrainSlugs83 2011-09-22 20:56:05

+1

+1,我喜歡這個解決方案,因爲它適用於Windows XP和Windows7,其中'date/t'分別返回爲'11/02/2011'和'Wed 11/02/2011'。 – JeffJak 2011-11-02 15:19:55

+0

它不適用於俄語區域! 而不是(dd mm yy) – vitperov 2017-07-06 12:50:44

5

我知道的唯一可靠的方法是使用VBScript爲你做繁重的工作。沒有一種便攜的方式可以單獨使用批處理文件以可用格式獲取當前日期。下面的VBScript文件

Wscript.Echo("set Year=" & DatePart("yyyy", Date)) 
Wscript.Echo("set Month=" & DatePart("m", Date)) 
Wscript.Echo("set Day=" & DatePart("d", Date)) 

和這批片斷

for /f "delims=" %%x in ('cscript /nologo date.vbs') do %%x 
echo %Year%-%Month%-%Day% 

應該工作,雖然。

雖然您可以使用date /t%date%僞變量獲取批處理文件中的當前日期,但它們都按照當前顯示的區域設置顯示。這意味着您可能獲得格式的任何格式的日期,並且您無法解析該格式。

+0

好吧......聽起來不錯,但是這些VBScript方法是否在cmd shell的範圍之內?我是否必須安裝庫並在腳本中引用它? – Mossen 2010-08-13 01:09:28

+0

'cscript'是Windows腳本宿主的控制檯解釋器。它自Windows 98以來在任何Windows的默認安裝(除了可能的服務器核心除外)之後都存在。但是,如果可能的話,我傾向於避免使用VBScript,因爲可以通過組策略禁用WSH。一些無法用批處理文件完成的事情。但在這個特定的情況下,純粹的批處理只是很痛苦。 – Joey 2010-08-13 01:19:01

25

要獲得年,月和日,您可以使用%date%環境變量和:~運算符。 %date%擴展到像週四08/12/2010和:~讓你拿起特定字符,變量的:

set year=%date:~10,4% 
set month=%date:~4,2% 
set day=%date:~7,2% 
set filename=%year%_%month%_%day% 

使用%time%以類似的方式,讓你從當前時間所需要的。

set /?會給你更多關於使用特殊操作變量的信息。

+14

這看起來很依賴於本地化。 – BrainSlugs83 2011-09-22 20:53:11

2

我認爲Andrei Coscodan的答案是最好的,當你無法做出很多假設時。但是,如果你可以做出一些假設,有時會有一個單行。此解決方案假定'date \ t'將返回兩種格式之一。在WindowsXP'date/t'返回「11/23/2011」,但在Windows7上它返回「Wed 11/23/2011」。

FOR /f "tokens=1-4 delims=/ " %%a in ('date /t') do (set mm=%%a&set dd=%%b&set yyyy=%%c& (if "%%a:~0,1" gtr "9" set mm=%%b&setdd=%%c&set yyyy=%%d)) 
:: Test results 
echo day in 'DD' format is '%dd%'; month in 'MM' format is '%mm%'; year in 'YYYY' format is '%yyyy%' 

感謝Andrei Consodan回答幫助我解決這個單線問題。

8

語言獨立性:

的安德烈Coscodan解決方案依賴於語言,這樣的方式來嘗試修復它是保留所有的每個字段標籤:年,月,日的目標語言。考慮葡萄牙語和英語,解析後做最後一組爲:

set Year=%yy%%aa% 
set Month=%mm% 
set Day=%dd% 

查找當年的設置,我用英語和葡萄牙語兩種標籤,它在巴西的工作對我來說,我們有這兩種語言的在Windows安裝中最常見。我預計這也適用於一些拉丁文語言的語言,如法語,西班牙語等。

那麼,完整的腳本可能是:

@echo off 
setlocal enabledelayedexpansion 

:: Extract date fields - language dependent 
for /f "tokens=1-4 delims=/-. " %%i in ('date /t') do (
     set v1=%%i& set v2=%%j& set v3=%%k 
     if "%%i:~0,1%%" gtr "9" (set v1=%%j& set v2=%%k& set v3=%%l) 

     for /f "skip=1 tokens=2-4 delims=(-)" %%m in ('echo.^|date') do (
      set %%m=!v1!& set %%n=!v2!& set %%o=!v3! 
    ) 
) 

:: Final set for language independency (English and Portuguese - maybe works for Spanish and French) 
set year=%yy%%aa% 
set month=%mm% 
set day=%dd% 


:: Testing 
echo Year:[%year%] - month:[%month%] - day:[%day%] 

endlocal 
pause 

我希望這可以幫助別人,與diferent語言處理。

+1

+1很好用(也用西班牙文)。 – 2014-02-17 11:44:18

+0

似乎不適用於德語(DD.MM.YYYY)。 – Kurtibert 2016-03-06 13:11:19

+0

@kurtibert:在第二部分「語言無關性最終設置」中,查看從yy(英語)和aa(葡萄牙語,西班牙語......)設置的年份變量。您可能需要包含其他語言的變量以設置年,月和日,它們的拼接是語言獨立性的方法。 – Luciano 2016-03-06 13:22:04

0
powershell Set-Date -Da (Get-Date -Y 1980 -Mon 11 -Day 17) 
8
echo %Date:~7,2% gets current day 

7開始位置 2的位數以顯示

echo %Date:~7,2% gets current day 

echo %Date:~4,2% gets current month 

echo %Date:~10,4% gets current year 
+1

非常好,功能強大的語法,謝謝分享。在我不得不使用它的情況下,這是最簡單和最清晰的解決方案。 – 2016-07-20 12:06:37

+2

不錯,但地方依賴。 – mattpm 2016-09-25 01:56:09

+0

如果'echo%Date%'輸出日期爲'dd/mm/yyyy'(如'12/05/2017'),則上述代碼如果更改爲'%Date:〜0.2%','%日期:〜3,2%'和'%日期:〜6.4%'。思考Windows是如何設計的(或者可以設計的),使用一段簡單的代碼就可以實現地點獨立性。這對於Linux或Unix一般來說不是問題,但是... – 2017-05-12 12:26:33

13

下面的批處理代碼返回當前日期的組分在語言環境無關的方式並存儲日,月份和年份分別爲變量CurrDay,CurrMonthCurrYear,分別爲:

for /F "skip=1 delims=" %%F in (' 
    wmic PATH Win32_LocalTime GET Day^,Month^,Year /FORMAT:TABLE 
') do (
    for /F "tokens=1-3" %%L in ("%%F") do (
     set CurrDay=0%%L 
     set CurrMonth=0%%M 
     set CurrYear=%%N 
    ) 
) 
set CurrDay=%CurrDay:~-2% 
set CurrMonth=%CurrMonth:~-2% 
echo Current day : %CurrDay% 
echo Current month: %CurrMonth% 
echo Current year :%CurrYear% 

有兩個嵌套的for /F循環可解決輸出爲unicode格式的wmic命令的問題;使用單個循環會產生額外的回車符,這會影響適當的變量擴展。

由於日期和月份也可能只包含一個數字,因此我在循環結構中預設了一個前導零0。之後,將值修剪爲始終由兩位數組成。

+0

適合我。 :)(德語) – Kurtibert 2016-03-06 13:13:58

+0

適合我(中文)。謝謝! – TerrenceSun 2016-09-24 04:30:08

3

這種變異適用於所有本地化:

@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 (
    if "%%B" NEQ "" (
     SET /A FDATE=%%F*10000+%%D*100+%%A 
    ) 
) 
@echo on 
echo date=%FDATE% 
echo year=%FDATE:~2,2% 
echo month=%FDATE:~4,2% 
相關問題