批处理脚本日期跨月问题求助:生成连续日期CSV文件
批处理脚本实现跨月连续日期生成并导出CSV
我编写了如下批处理脚本,用于从运行当日的次日开始生成连续日期,并将其导出至CSV文件。目前脚本仅对日期进行累加,当日期达到31天后,会继续生成32、33等无效日期,无法自动切换至下月。期望生成的CSV文件能够像示例那样自动跨月,生成有效的日期格式。
现有脚本
@Echo off WMIC.EXE Alias /? >NUL 2>&1 || GOTO s_error FOR /F "skip=1 tokens=1-6" %%G IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO ( IF "%%~L"=="" goto s_done Set _yyyy=%%L Set _mm=00%%J Set _dd=00%%G Set _hour=00%%H SET _minute=00%%I ) :s_done :: Pad digits with leading zeros Set _mm=%_mm:~-2% Set _dd=%_dd:~-2% Set _hour=%_hour:~-2% Set _minute=%_minute:~-2% set /a _dd+=1 Set z1=%_mm%/%_dd%/%_yyyy% set /a _dd+=1 Set z2=%_mm%/%_dd%/%_yyyy% set /a _dd+=1 Set z3=%_mm%/%_dd%/%_yyyy% set /a _dd+=1 Set z4=%_mm%/%_dd%/%_yyyy% set /a _dd+=1 Set z5=%_mm%/%_dd%/%_yyyy% set /a _dd+=1 Set z6=%_mm%/%_dd%/%_yyyy% set /a _dd+=1 Set z7=%_mm%/%_dd%/%_yyyy% set /a _dd+=1 Set z8=%_mm%/%_dd%/%_yyyy% set /a _dd+=1 Set z9=%_mm%/%_dd%/%_yyyy% set /a _dd+=1 Set z10=%_mm%/%_dd%/%_yyyy% set /a _dd+=1 Set z11=%_mm%/%_dd%/%_yyyy% set /a _dd+=1 Set z12=%_mm%/%_dd%/%_yyyy% set /a _dd+=1 Set z13=%_mm%/%_dd%/%_yyyy% set /a _dd+=1 Set z14=%_mm%/%_dd%/%_yyyy% set /a _dd+=1 Set z15=%_mm%/%_dd%/%_yyyy% Echo %z1%,12:15 AM,5:00 AM,10:00 AM,12:15 PM,5:00 PM,10:00 PM, >> dates.csv Echo %z2%,12:15 AM,5:00 AM,10:00 AM,12:15 PM,5:00 PM,10:00 PM, >> dates.csv Echo %z3%,12:15 AM,5:00 AM,10:00 AM,12:15 PM,5:00 PM,10:00 PM, >> dates.csv Echo %z4%,12:15 AM,5:00 AM,10:00 AM,12:15 PM,5:00 PM,10:00 PM, >> dates.csv Echo %z5%,12:15 AM,5:00 AM,10:00 AM,12:15 PM,5:00 PM,10:00 PM, >> dates.csv Echo %z6%,12:15 AM,5:00 AM,10:00 AM,12:15 PM,5:00 PM,10:00 PM, >> dates.csv Echo %z7%,12:15 AM,5:00 AM,10:00 AM,12:15 PM,5:00 PM,10:00 PM, >> dates.csv Echo %z8%,12:15 AM,5:00 AM,10:00 AM,12:15 PM,5:00 PM,10:00 PM, >> dates.csv Echo %z9%,12:15 AM,5:00 AM,10:00 AM,12:15 PM,5:00 PM,10:00 PM, >> dates.csv Echo %z10%,12:15 AM,5:00 AM,10:00 AM,12:15 PM,5:00 PM,10:00 PM, >> dates.csv Echo %z11%,12:15 AM,5:00 AM,10:00 AM,12:15 PM,5:00 PM,10:00 PM, >> dates.csv Echo %z12%,12:15 AM,5:00 AM,10:00 AM,12:15 PM,5:00 PM,10:00 PM, >> dates.csv Echo %z13%,12:15 AM,5:00 AM,10:00 AM,12:15 PM,5:00 PM,10:00 PM, >> dates.csv Echo %z14%,12:15 AM,5:00 AM,10:00 AM,12:15 PM,5:00 PM,10:00 PM, >> dates.csv Echo %z15%,12:15 AM,5:00 AM,10:00 AM,12:15 PM,5:00 PM,10:00 PM, >> dates.csv pause
期望导出的CSV格式
10/28/2022,12:15 AM,5:00 AM,10:00 AM,12:15 PM,5:00 PM,10:00 PM 10/29/2022,12:15 AM,5:00 AM,10:00 AM,12:15 PM,5:00 PM,10:00 PM 10/30/2022,12:15 AM,5:00 AM,10:00 AM,12:15 PM,5:00 PM,10:00 PM 10/31/2022,12:15 AM,5:00 AM,10:00 AM,12:15 PM,5:00 PM,10:00 PM 11/1/2022,12:15 AM,5:00 AM,10:00 AM,12:15 PM,5:00 PM,10:00 PM 11/2/2022,12:15 AM,5:00 AM,10:00 AM,12:15 PM,5:00 PM,10:00 PM 11/3/2022,12:15 AM,5:00 AM,10:00 AM,12:15 PM,5:00 PM,10:00 PM 11/4/2022,12:15 AM,5:00 AM,10:00 AM,12:15 PM,5:00 PM,10:00 PM
解决方案
批处理原生处理日期跨月逻辑非常繁琐,建议借助PowerShell来完成日期计算,它能自动处理月份、年份的切换,代码更简洁可靠。以下是修正后的脚本:
@echo off setlocal enabledelayedexpansion :: 清空原有CSV文件(可选,根据需求调整) if exist dates.csv del dates.csv :: 获取当前日期,计算次日作为起始日期,循环生成15天的日期 for /l %%i in (1,1,15) do ( :: 调用PowerShell计算第%%i天的日期(从次日开始) for /f "delims=" %%d in ('powershell -Command "(Get-Date).AddDays(%%i).ToString('M/d/yyyy')"') do ( set "current_date=%%d" ) :: 写入CSV echo !current_date!,12:15 AM,5:00 AM,10:00 AM,12:15 PM,5:00 PM,10:00 PM>> dates.csv ) echo 日期生成完成,已保存到dates.csv pause
关键说明
- PowerShell日期计算:通过
Get-Date.AddDays(%%i)自动累加天数,无需手动处理月份切换、闰年等复杂逻辑,生成的日期格式直接符合需求。 - 延迟变量扩展:启用
enabledelayedexpansion确保循环中变量current_date能正确更新。 - CSV写入:每次循环生成对应日期的CSV行,自动追加到文件中。
内容的提问来源于stack exchange,提问作者Ionut Bejinariu
相关产品推荐
相关产品推荐

