如何从Windows cmd.exe脚本获取日期和年份?

Mos*_*sen 34 scripting cmd date

如何从Windows cmd脚本中获取当前的月份和年份?我需要将每个值都放入一个单独的变量中.

pok*_*oke 34

要获得年,月和日,您可以使用%date%环境变量和:~运算符. %date%扩展到Thu 08/12/2010之类的东西,并:~允许您从变量中选取特定字符:

set year=%date:~10,4%
set month=%date:~4,2%
set day=%date:~7,2%
set filename=%year%_%month%_%day%
Run Code Online (Sandbox Code Playgroud)

%time%以类似的方式使用从当前时间获得您需要的东西.

set /? 将为您提供有关使用带变量的特殊运算符的更多信息.

  • 这似乎高度本地化依赖. (27认同)

asc*_*pfl 32

以下批处理代码语言环境无关的方式返回当前日期的组件,并将日,月和年分别存储在变量中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%
Run Code Online (Sandbox Code Playgroud)

有两个嵌套for /F循环可以解决wmic命令的问题,其输出采用unicode格式; 使用单个循环会导致额外的回车符,这会影响适当的变量扩展.

由于日期和月份也可能只包含一个数字,因此我0在循环结构中添加前导零.然后,将值修剪为始终由两位数组成.

  • 对我有用(英语),尽管它们都对我有用:P (2认同)

And*_*dan 23

一种独立于区域设置的脚本变体.将其放在扩展名为.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%
Run Code Online (Sandbox Code Playgroud)

变量%dd%,%mm%和%yy%将分别保留日('DD'格式),月('MM'格式)和年('YYYY'格式).

  • 没有测试过这个,但我怀疑它也是高度本地化的. (4认同)
  • +1,我喜欢这个解决方案,因为它适用于 Windows XP 和 Windows7,其中“date /t”分别返回为“11/02/2011”和“Wed 11/02/2011”。 (2认同)

Ash*_*raf 13

echo %Date:~7,2% gets current day
Run Code Online (Sandbox Code Playgroud)

7是开始位置2要显示的位数

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

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

echo %Date:~10,4% gets current year
Run Code Online (Sandbox Code Playgroud)

  • 不错,但地点依赖. (7认同)
  • 如果 `echo %Date%` 输出日期为 `dd/mm/yyyy` (如 `12/05/2017`),则上面的代码如果更改为 `%Date:~0,2%`、`%Date 就可以工作:~3,2%` 和 `%日期:~6,4%`。考虑一下 Windows 是如何设计的(或者可以设计的),局部独立性似乎很难用一段简单的代码来实现。不过,对于一般的 Linux 或 Unix 来说这不是问题…… (2认同)

Luc*_*ano 9

语言独立性:

Andrei Coscodan解决方案依赖于语言,因此尝试修复它的方法是为每个字段保留所有标记:年,月和日目标语言.考虑到葡萄牙语和英语,在解析后做最终设置为:

set Year=%yy%%aa%
set Month=%mm%
set Day=%dd%
Run Code Online (Sandbox Code Playgroud)

寻找年份设置,我使用了英语和葡萄牙语的两个标签,它在巴西有用,我们在Windows instalations中最常见这两种语言.我希望这也适用于拉丁语的一些语言,如法语,西班牙语等.

好吧,完整的脚本可能是:

@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
Run Code Online (Sandbox Code Playgroud)

我希望这有助于处理不同语言的人.


Joe*_*oey 7

我所知道的唯一可靠方法是使用VBScript为您完成繁重的工作.没有便携式方法可以使用批处理文件以可用格式获取当前日期.以下VBScript文件

Wscript.Echo("set Year=" & DatePart("yyyy", Date))
Wscript.Echo("set Month=" & DatePart("m", Date))
Wscript.Echo("set Day=" & DatePart("d", Date))
Run Code Online (Sandbox Code Playgroud)

和这个批处理片段

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

应该工作.

虽然您可以使用其中一个date /t%date%伪变量在批处理文件中获取当前日期,但它们都会在它们显示的内容中跟随当前区域设置.这意味着您可能以任何格式获取日期,而您无法解析该日期.


vit*_*rov 6

此变体适用于所有本地化:

@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%
Run Code Online (Sandbox Code Playgroud)