【问题标题】:Cmd: use batch file to process %date% variable failedCmd:使用批处理文件处理 %date% 变量失败
【发布时间】:2015-08-18 02:42:49
【问题描述】:

我希望使用批处理命令来解析 %date% 变量,以获取年/月/日,如下所示:

>echo %date
Tue 08/18/2015

我希望解析 %a=2015, %b=08, %c=18,所以我有如下的 .bat:

@echo off
rem Get current date and calculate DayOfWeek
for /F "tokens=1-3 delims=/" %%a in ("%date%") do (
   set /A mm=%%a, dd=%%b, yy=%%c
)

但是执行失败,说:

Missing operator.

如何修复我的 .bat 文件?非常感谢。

【问题讨论】:

    标签: windows date batch-file for-loop cmd


    【解决方案1】:

    使用"delims=/""Tue 08/18/2015" 中的第一个标记会生成Tue 08。使用

    @echo off
    rem Get current date and calculate DayOfWeek
    for /F "tokens=2-4 delims=/ " %%a in ("%date%") do (
        set /A "_mm=1%%a %% 100"
        set /A "_dd=1%%b %% 100"
        set /A _yy=%%c
    )
    set _
    

    输出:

    ==>D:\bat\SO\32062701.bat
    _dd=18
    _mm=8
    _yy=2015
    

    set /A "mm=1%%a %% 100" 技巧可防止出现Invalid number. Numeric constants are either decimal (17), hexadecimal (0x11), or octal (021) 错误。阅读全文 set /?http://ss64.com/nt/set.html 以了解相同数字的十进制 (17) 与十六进制 (0x11) 与八进制 (021) 表示法的解释。

    八进制表示法可能会令人困惑 - 所有以数字开头的值 零被视为八进制,但 0809 不是有效的八进制 位数。例如,SET /a _month=07 将返回值 7,但 SET /a _month=09 将返回错误。

    1%%a 表示字符串1 和(已评估)%%a连接:如果%%a 评估为08,则结果为108%%modulus 运算符的批符号。因此,1%%a %% 100 表示108 除以100 后的余数,即8

    要让您的脚本语言环境独立,请从 WMIC 输出中提取值:

    wmic os get LocalDateTime | find "."
    

    或者试试

    wmic path Win32_LocalTime get /value
    

    【讨论】:

    • 谢谢,我只是不太了解“设置”技巧。 1%%a 是什么意思? %% 100 是什么意思?而“1%%a %% 100”里面的空格究竟是什么意思?
    • @ImmanuelKant - 1%%a 表示取 %%a 的值并在其前面粘贴 1。 %%modulus 运算符。这些空格是不必要的,只是个人喜好,可能是为了便于阅读。
    【解决方案2】:

    解析 %date% 变量是不可靠的,因为格式会根据机器上的语言环境/区域/用户设置而变化。

    这是获取可靠日期字符串的一种方法。

    @echo off
    
    rem The four lines below will give you reliable YY DD MM YYYY HH Min Sec MS variables in XP Pro and higher.
    
    for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
    set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
    set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%" & set "MS=%dt:~15,3%"
    set "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%" & set "fullstamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%-%MS%"
    
    echo datestamp: "%datestamp%"
    echo timestamp: "%timestamp%"
    echo fullstamp: "%fullstamp%"
    pause
    

    【讨论】:

      【解决方案3】:

      如果您只想在计算机中获取 DayOfWeek,您有两个简单的解决方案。第一个是直接从 %date% 变量“Tue 08/18/2015”的第一个单词中获取它:)

      for /F %%a in ("%date%") do set dow=%%a
      

      但如果要进行数值计算,可以使用this answer处显示的方法将日期转换为儒略日数:

      @echo off
      setlocal
      
      rem Modify next line accordingly to your locale format (this one use "Dow MM/DD/YYYY")
      for /F "tokens=2-4 delims=/ " %%a in ("%date%") do set /A mm=1%%a-100, dd=1%%b-100, yyyy=%%c
      
      rem Convert the Date to Julian Day Number, and get its Day Of Week (0=Sunday, ..., 6=Saturday)
      set /A a=(mm-14)/12, jdn=(1461*(yyyy+4800+a))/4+(367*(mm-2-12*a))/12-(3*((yyyy+4900+a)/100))/4+dd-32075, dow=(jdn+1)%%7
      
      rem Show the result
      echo Day of week: %dow%
      

      set 命令使用其他答案中解释的技巧来正确获取大于 07 且以零开头的数字。例如,如果 mont 是 08,那么 set /A mm=1%%a-100set /A mm=108-100,则为 8。

      但是,如果你想在不同的计算机上使用这种方法,可能有不同的locale日期格式,那么你必须使用foxidrive建议的方法。

      【讨论】:

        猜你喜欢
        • 2013-11-15
        • 2017-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-23
        相关资源
        最近更新 更多