批处理脚本将日期存入变量

6
for /F "tokens=1-4 delims=/ " %%i in ('date /t') do (
set Day=%%k
set Month=%%j
set Year=%%l
set DATE=%%k/%%j/%%l)

我正在尝试在批处理脚本中将日期赋值给上述变量,但目前日期的输出结果为

2011/04/

有没有关于如何修复这个问题的建议?

我得到了DATE=04/08/2011 - 这是基于你的Windows设置,对吧? - Preet Sangha
8个回答

18

因为%DATE%使用Windows设置中的“短日期格式”返回当前日期,所以你得到的不是你期望的结果。这个设置可以完全(无限制地)自定义。

一个用户可能将其系统配置为显示短日期为Fri040811;而另一个用户(甚至在同一系统中)可能选择08/04/2011。对于BAT程序员来说,这是一个彻头彻尾的噩梦。

一个可能的解决方案是使用WMIC。WMIC是WMI命令行接口。 WMI Windows Management Instrumentationhttp://en.wikipedia.org/wiki/Windows_Management_Instrumentation

WMIC Path Win32_LocalTime Get Day,Hour,Minute,Month,Second,Year /Format:table

以一种方便用于直接解析的方式返回日期,可以使用FOR进行解析。

完成解析并将各个部分组合在一起。

 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 TODAY=%%F*10000+%%D*100+%%A
 )

或者:for /f %%a in ('wmic os get LocalDateTime ^| findstr ^[0-9]') do (set ts=%%a) & set datetime=%ts:~0,8%-%ts:~8,4%(此命令获取的是当前荷兰的一个 20120623-1617,因此忽略任何时区信息)。 - Arjan
@Arjan:我在CMD中使用这个%date%格式,在AUS得到了“0,8ts:8,4”的结果:27/11/2012。 - CAD bloke
@PA 这个代码可以运行,但是在 AUS 设置中出现了“缺少操作数”的错误(CMD 中的 %date% 格式为 27/11/2012)。它输出 C:--->(SET /A today=201210000+11100+27 ) )---->(SET /A today=*10000+*100+ 缺少操作数。 - CAD bloke
这个链接:http://serverfault.com/questions/227345/locale-unaware-date-and-time-in-batch-files 对我很有帮助。 - CAD bloke

8

我从已有的解决方案中总结出了最简洁的方法。这个方法适用于所有系统(XP专业版及以上版本):

REM ===================================================================
REM CREATE UNIQUE DATETIME STRING IN FORMAT YYYYMMDD-HHMMSS
REM ======================================================================
FOR /f %%a IN ('WMIC OS GET LocalDateTime ^| FIND "."') DO SET DTS=%%a
SET DateTime=%DTS:~0,8%-%DTS:~8,6%
REM ======================================================================

当然,您可以使用生成的字符串格式进行操作。

3

这是我在XP专业版及更高版本中使用的方法。XP家庭版没有wmic命令。

:: timestamp YYYYMMDD_HHMMSS
@echo off
for /f "delims=" %%a in ('wmic OS Get localdatetime  ^| find "."') do set dt=%%a
set dt=%dt:~0,8%_%dt:~8,6%
echo %dt%
pause

而另外一个

:: timestamp YYYY-MM-DD_HH-MM-SS
@echo off
for /f "delims=" %%a in ('wmic OS Get localdatetime  ^| find "."') do set dt=%%a
set dt=%dt:~0,4%-%dt:~4,2%-%dt:~6,2%_%dt:~8,2%-%dt:~10,2%-%dt:~12,2%
echo %dt%
pause

我在Windows7环境中使用了这个。我必须补充说明的是,它将始终给出相同的结果,无论本地设置如何,不涉及数学,并包括时间。 - Jay

3
我想这是你想要的内容:

我认为这是你想要的:

@echo off
:MENU
CLS
for /f "delims=" %%a in ('wmic OS Get localdatetime  ^| find "."') do set xsukax=%%a
echo Year=%xsukax:~0,4%
echo Month=%xsukax:~4,2%
echo Day=%xsukax:~6,2%
echo hour=%xsukax:~8,2%
echo Minutes=%xsukax:~10,2%
echo seconds=%xsukax:~12,2%

pause
goto MENU

1

你不能仅使用以下1行代码创建变量吗(使用任何变量名称)?

set ymd=%date:~6,4%/%date:~0,2%/%date:~3,2%

1
它取决于变量%date%的区域设置和格式,这是可变的。只要没有人更改日期设置,它在单台机器上运行得很好。 - foxidrive

1

请随意使用此内容

:: Date in year, day, month format

FOR /f "tokens=2-4 skip=1 delims=(-)" %%G IN ('echo.^|date') DO (
    FOR /f "tokens=2 delims= " %%A IN ('date /t') DO (
        SET v_first=%%G
        SET v_second=%%H
        SET v_third=%%I
        SET v_all=%%A
        )
    )

SET %v_first%=%v_all:~0,2%
SET %v_second%=%v_all:~3,2%
SET %v_third%=%v_all:~6,4%
SET DATE2= %MM%_%DD%_%YY%
ECHO. The date is: %DATE2%

0
for /f %%a in ('wmic os get localdatetime ^| find "."') do set dts=%%a
set ymd=%dts:~0,8%
set hour=%dts:~8,6%

0
以下脚本将提供带有时区(TZ)信息的本地时间,以真正的ISO8601格式和人类可读格式(无“T”)。它将分钟中的TZ偏移转换为所需的HHMM格式,例如2019-01-25T08:26:55.347+13002019-01-25 08:26:55.347+1300适用于具有夏令时的新西兰。
@echo off
for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if '.%%i.'=='.LocalDateTime.' set ldt=%%j
set ccyy_mm_dd=%ldt:~0,4%-%ldt:~4,2%-%ldt:~6,2%
set hh_mm_ss=%ldt:~8,2%:%ldt:~10,2%:%ldt:~12,2%
set _fff=%ldt:~14,4%
set tzsign=%ldt:~21,1%
set tzmins=%ldt:~22%
set /a tzHH=(%tzmins%/60)
set /a tzMM=(%tzmins%-(%tzHH%*60))
set /a tzHH=100 + %tzHH%
set tzHH=%tzHH:~1,2%
set /a tzMM=100 + %tzMM%
set tzMM=%tzMM:~1,2%
set ldt=%ccyy_mm_dd% %hh_mm_ss%%_fff%%tzsign%%tzHH%%tzMM%
set ldt8601=%ccyy_mm_dd%T%hh_mm_ss%%_fff%%tzsign%%tzHH%%tzMM%
echo %ldt%
echo %ldt8601%

你可能想要删除其中一个 echo 命令

编辑 对于那些希望在 TZ 中加入冒号的人,将 %tzHH%%tzMM% 改为 %tzHH%:%tzMM%


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接