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

问题描述 投票:33回答:13

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

scripting date cmd
13个回答
22
投票

一种独立于区域设置的脚本变体。将其放在扩展名为.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%,%mm%和%yy%将分别保留日('DD'格式),月('MM'格式)和年('YYYY'格式)。


0
投票

我已经在脚本中为此目的转换为使用Powershell调用。它需要脚本执行权限,是迄今为止最慢的选项。然而,它也是独立于本地化的,非常容易编写和读取,并且对诸如加法/减法之类的日期进行调整或者获得该月的最后一天等等更加可行。

以下是获取日,月和年的方法

for /f %%i in ('"powershell (Get-Date).ToString(\"dd\")"') do set day=%%i
for /f %%i in ('"powershell (Get-Date).ToString(\"MM\")"') do set month=%%i
for /f %%i in ('"powershell (Get-Date).ToString(\"yyyy\")"') do set year=%%i

或者,这是昨天yyyy-MM-dd格式的日期

for /f %%i in ('"powershell (Get-Date).AddDays(-1).ToString(\"yyyy-MM-dd\")"') do set yesterday=%%i

一周中的天

for /f %%d in ('"powershell (Get-Date).DayOfWeek"') do set DayOfWeek=%%d

当前时间加上15分钟

for /f %%i in ('"powershell (Get-Date).AddMinutes(15).ToString(\"HH:mm\")"') do set time=%%i


0
投票
  • 一条线!

尝试使用2个分隔符(等于+点)进行循环:=.

@for /f "tokens=2delims==." %i in ('wmic OS Get localdatetime /value ^|findstr /r [0-9]')do @cmd/v/c "set _date=%i &&echo/ year: !_date:~0,4!&&echo/month:   !_date:~4,2!&&echo/  day:   !_date:~6,2!"

命令行结果:


 year: 2019
month:   06
  day:   12
  • 适用于任何语言/区域,并且输出布局中没有用户设置。

对于bat文件:


@for /f "tokens=2delims==." %%i in ('wmic OS Get localdatetime /value ^|findstr /r [0-9]')do @cmd/v/c "set _date=%%i &&echo/ year: !_date:~0,4!&&echo/month:   !_date:~4,2!&&echo/  day:   !_date:~6,2!"


-1
投票
powershell Set-Date -Da (Get-Date -Y 1980 -Mon 11 -Day 17)

-1
投票

您可以使用简单的变量语法,这是一个示例:

@echo off
set month=%date:~0,2%
set day=%date:~3,2%
set year=%date:~6,4%
echo The current month is %month%
echo The current day is %day%
echo The current year is %year%
pause >nul

另一种选择是for命令,这是我的例子:

@echo off
for /f "delims=/ tokens=1-3" %%a in ("%date%") do (
set month=%%a
set day=%%b
set year=%%c
)
echo The current month is %month%
echo The current day is %day%
echo The current year is %year%
pause >nul

33
投票

要获得年,月和日,您可以使用%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%

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

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


26
投票

以下批处理代码以与语言环境无关的方式返回当前日期的组件,并分别在变量CurrDayCurrMonthCurrYear中存储日,月和年:

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循环来解决wmic命令的问题,它的输出是unicode格式;使用单个循环会导致额外的回车符,这会影响适当的变量扩展。

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


13
投票
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

9
投票

语言独立性:

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

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

寻找年份设置,我使用了英语和葡萄牙语的两个标签,它在巴西有用,我们在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

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


6
投票

我所知道的唯一可靠方法是使用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%伪变量在批处理文件中获取当前日期,但它们都会在它们显示的内容中跟随当前区域设置。这意味着您可能以任何格式获取日期,而您无法解析该日期。


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%

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的回答,帮助我解决这个单线解决方案。


0
投票

提取日,月和年

由于DATE命令也受本地化影响,因此最高投票功能和已接受的功能不能独立于区域设置。例如(被接受的一个):在英语中,你有一年的YYYY,在荷兰,它是JJJJ。所以这是不行的。以下脚本从注册表中获取用户的本地化,该注册表与语言环境无关。

@echo off

::: Begin set date
setlocal EnableExtensions EnableDelayedExpansion

:: Determine short date format (independent from localization) from registry
for /f "skip=1 tokens=3-5 delims=- " %%L in ( '2^>nul reg query "HKCU\Control Panel\International" /v "sShortDate"' ) do ( 

    :: Since we can have multiple (short) date formats we only use the first char from the format in a new variable
    set "_L=%%L" && set "_L=!_L:~0,1!" && set "_M=%%M" && set "_M=!_M:~0,1!" && set "_N=%%N" && set "_N=!_N:~0,1!"

    :: Now assign the date values to the new vars
    for /f "tokens=2-4 delims=/-. " %%D in ( "%date%" ) do ( set "!_L!=%%D" && set "!_M!=%%E" && set "!_N!=%%F" )
)


:: Print the values as is
echo.
echo This is the original date string --^> %date%
echo These are the splitted values    --^> Day: %d%, Month:%m%, Year: %y%.
echo.

endlocal

仅提取年份

对于我写的脚本,我只想提取年份(与语言环境无关),所以我想出了这个oneliner,因为我找不到任何解决方案。它使用'DATE'var,多个分隔符并检查大于31的数字。然后将是当前年份。与其他一些解决方案相比,它的资源较少。

@echo off

setlocal EnableExtensions

for /f " tokens=2-4 delims=-./ " %%D in ( "%date%" ) do ( if %%D gtr 31 ( set "_YEAR=%%D" ) else ( if %%E gtr 31 ( set "_YEAR=%%E" ) else ( if %%F gtr 31 ( set "_YEAR=%%F" ) ) ) )

echo And the year is... %_YEAR%.
echo.

endlocal
© www.soinside.com 2019 - 2024. All rights reserved.