【问题标题】:get last month first date and last date in batch file在批处理文件中获取上个月的第一个日期和最后一个日期
【发布时间】:2015-09-09 10:10:34
【问题描述】:

我正在创建一个批处理文件来执行一些 exe 文件。在那个 exe 中,我需要指定上个月的第一个日期(mm/dd/yyyy)和最后一天(mm/dd/yyyy)。

@echo off
start "Testing" "c:\Program Files\app-cmd\bin\admincmd\imagelist -d 08/01/2015 -e 01/09/2015 > c:\test.txt" 

Imagelist 是一个 exe 文件,我需要在 -d-e 参数中传递值。 我将在计划任务中添加此脚本,以便它按计划运行。

我不能使用powershell,因为机器是win server 2003。

请指教。

【问题讨论】:

  • 谢谢我现在检查。啊,它是关于 javascript 的。
  • 仍然不确定您的问题是什么。您想获取当前日期为 mm/dd/yyyy 以将其传递给脚本吗?
  • 不,我试图在 mm/dd/yyyy 中获取上个月的第一个和最后一个日期,以将其传递给脚本。

标签: windows batch-file command-line cmd


【解决方案1】:

假设您系统上的日期格式为 MM/DD/YYYY,如 date /t 命令所示:

@echo off
setlocal enableDelayedExpansion

for /f "delims=/ tokens=1,3" %%a in ("%date%") do set month=%%a& set year=%%b

if %month:~0,1%==0 set month=%month:~1%
set /a month-=1 && if !month!==0 set month=12&set /a year-=1

if not !month!==2 (
    set /a last_day="31 - (month - 1) %% 7 %% 2"
) else (
    set /a y4="year %% 4" & if !y4!==0 (
        set /a y100="year %% 100" & if not !y100!==0 set is_leap_year=1
        set /a y400="year %% 400" & if !y400!==0 set is_leap_year=1
    )
    if "!is_leap_year!"=="1" (set last_day=29) else set last_day=28
)

set month=0!month!
start "Testing" "c:\Program Files\app-cmd\bin\admincmd\imagelist" ^
    -d !month:~-2!/01/!year! -e !month:~-2!/!last_day!/!year! > c:\test.txt

代码将二月的闰年检测为(year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0)),其他月份使用31 - (month - 1) % 7 % 2

【讨论】:

  • 感谢您的回答
  • 一个问题。它给了我当前月份的日期。我在找上个月的。
  • 我不能这么说。脚本应该需要获取上个月的值。在这种情况下,sep 是当前月份,那么脚本应该输出 aug 的结果
  • 我认为 %year% 有问题,因为它没有提供任何输出。
【解决方案2】:

你可以试试

@echo off
    setlocal enableextensions

    call :getLastMonthLimits start end
    echo %start% - %end%

    goto :eof

:getLastMonthLimits startDateReturnVar endDateReturnVar
    setlocal enableextensions disabledelayedexpansion
    for %%t in ("%temp%\%~nx0.%random%%random%%random%.rpt") do (
        for /f "tokens=4,7" %%a in ('
            ^>nul makecab /f nul /d RptFileName^="%%~ft" /V0  
            ^& type "%%~ft" ^| find "MakeCAB Report:"
        ') do (
            set /a "jan=1,feb=2,mar=3,apr=4,may=5,jun=6,jul=7,aug=8,sep=9,oct=10,nov=11,dec=12"
            set /a "m=(%%a+10) %% 12 + 1", "y=%%b-m/12", "d=30+((m+m/8) %% 2)", "m+=100"
            if /i %%a==mar set /a "d=d-2 +(3-y %% 4)/3 -(99-y %% 100)/99 +(399-y %% 400)/399"
            set /a "d+=100"
        ) 
    ) & del "%%~ft"
    endlocal & set "%~1=%m:~-2%/01/%y%" & set "%~2=%m:~-2%/%d:~-2%/%y%"
    goto :eof

这使用getDate function by carlos 的简化版本以独立于区域设置的格式获取日期(我更喜欢使用robocopy,但它不是2003 年的本地工具)。其余的只是计算月份限制的算术运算。

已编辑对于 robocopy 版本(而不是 makecab 以独立于区域设置的格式检索日期),以防万一有人需要它

@echo off

    call :getLastMonthLimits start end
    echo %start% - %end%

    goto :eof

:getLastMonthLimits startDateReturnVar endDateReturnVar
    setlocal enableextensions disabledelayedexpansion
    for /f "tokens=1-2 delims=/ " %%a in ('robocopy "|" . /njh ^| find "|"') do (
        set /a "m=((1%%b-100)+10) %% 12 + 1", "y=%%a-m/12", "d=30+((m+m/8) %% 2)", "m+=100"
        if %%b==03 set /a "d=d-2 +(3-y %% 4)/3 -(99-y %% 100)/99 +(399-y %% 400)/399"
        set /a "d+=100"
    )
    endlocal & set "%~1=%m:~-2%/01/%y%" & set "%~2=%m:~-2%/%d:~-2%/%y%"
    goto :eof

【讨论】:

  • 感谢您的回答。 wOxxOm 答案更适合我的场景。投票赞成。
  • 谢谢。非常适合我需要编写的脚本。特别是作为原始版本的附加编辑(使用 makecab)不适用于计划任务(尽管也可能是被设置为运行任务的用户)。
猜你喜欢
  • 2012-05-29
  • 1970-01-01
  • 1970-01-01
  • 2018-01-30
  • 1970-01-01
  • 2013-06-23
  • 2013-02-09
  • 1970-01-01
  • 2021-03-22
相关资源
最近更新 更多