Board logo

标题: [日期时间] 批处理如何每月每天排除周六和周日生成日期文件夹? [打印本页]

作者: kmcc123    时间: 6 天前 19:01     标题: 批处理如何每月每天排除周六和周日生成日期文件夹?

每月每天排除周六和周日生成日期文件夹,好像那里出错,没有排除周六和周日
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :: 设置起始年份和结束年份
  4. set START_YEAR=2024
  5. set END_YEAR=2024
  6. :: 设置起始月份和结束月份
  7. set START_MONTH=11
  8. set END_MONTH=12
  9. for /l %%y in (%START_YEAR%, 1, %END_YEAR%) do (
  10.     for /l %%m in (%START_MONTH%, 1, %END_MONTH%) do (
  11.         set /a days=0
  12.         set /a days=!days!+1
  13.         set /a days=!days!+1
  14.         for /l %%d in (1, 1, 30) do (
  15.             set /a days=!days!+1
  16.             set /a w=!days!%%7
  17.             if !w! GEQ 1 if !w! LEQ 5 (
  18.                mkdir "%%y\%%y-%%m\%%y-%%m-%%d"  >nul 2>nul
  19.             )
  20.         )
  21.         if %%m==2 (
  22.             set /a days=!days!+1
  23.             set /a w=!days!%%7
  24.             if !w! GEQ 1 if !w! LEQ 5 (
  25.                mkdir "%%y\%%y-%%m\%%y-%%m-29"  >nul 2>nul
  26.             )
  27.         )
  28.         if %%m==4 (
  29.             set /a days=!days!+1
  30.             set /a w=!days!%%7
  31.             if !w! GEQ 1 if !w! LEQ 5 (
  32.                mkdir "%%y\%%y-%%m\%%y-%%m-30"  >nul 2>nul
  33.             )
  34.         )
  35.         if %%m==6 (
  36.             set /a days=!days!+1
  37.             set /a w=!days!%%7
  38.             if !w! GEQ 1 if !w! LEQ 5 (
  39.                mkdir "%%y\%%y-%%m\%%y-%%m-30"  >nul 2>nul
  40.             )
  41.         )
  42.         if %%m==9 (
  43.             set /a days=!days!+1
  44.             set /a w=!days!%%7
  45.             if !w! GEQ 1 if !w! LEQ 5 (
  46.                mkdir "%%y\%%y-%%m\%%y-%%m-30"  >nul 2>nul
  47.             )
  48.         )
  49.         if %%m==11 (
  50.             set /a days=!days!+1
  51.             set /a w=!days!%%7
  52.             if !w! GEQ 1 if !w! LEQ 5 (
  53.                mkdir "%%y\%%y-%%m\%%y-%%m-30"  >nul 2>nul
  54.             )
  55.         )
  56.     )
  57. )
  58. endlocal
  59. echo. & pause
复制代码

作者: hnfeng    时间: 6 天前 19:48

如果你的系统支持powershell的话,感觉用powershell来处理会更方便一点
作者: went    时间: 5 天前 00:37

写了几个通用函数
  1. @echo off & cd /d ""%~dp0
  2. setlocal enabledelayedexpansion
  3. :: 设置起始年份和结束年份
  4. set START_YEAR=2024
  5. set END_YEAR=2024
  6. :: 设置起始月份和结束月份
  7. set START_MONTH=11
  8. set END_MONTH=12
  9. for /l %%y in (%START_YEAR%, 1, %END_YEAR%) do (
  10.     for /l %%m in (%START_MONTH%, 1, %END_MONTH%) do (
  11. call :get_monthday %%y %%m
  12. set "END_DAY=!_RET_!"
  13. for /l %%d in (1,1,!END_DAY!) do (
  14. call :get_weekday %%y %%m %%d
  15. echo %%y-%%m-%%d week!_RET_!
  16. rem 跳过周六周日
  17. if not !_RET_!==6 if not !_RET_!==7 (
  18. echo mkdir %%y\%%y-%%m\%%y-%%m-%%d
  19. mkdir %%y\%%y-%%m\%%y-%%m-%%d >nul 2>nul
  20. )
  21. echo -------------------------
  22. )
  23. )
  24. )
  25. pause&exit
  26. rem 获取某一天是星期几 _RET_[1-7]:get_weekday(year,month,day)
  27. :get_weekday
  28. call :get_days %1 %2 %3
  29. set /a "_RET_=%_RET_%%%7"
  30. if,%_RET_%==0 set "_RET_=7"
  31. goto :eof
  32. rem 获取总天数  _RET_:get_days(year,month,day)
  33. :get_days
  34. set /a "y=%1-1"
  35. set /a "y1=%y%/4-%y%/100+%y%/400"
  36. set /a "m1=0,m2=m1+31"
  37. call :check_r %1 && (set /a m3=m2+29) || (set /a m3=m2+28)
  38. set /a "m4=m3+31,m5=m4+30,m6=m5+31,m7=m6+30,m8=m7+31,m9=m8+31,m10=m9+30,m11=m10+31,m12=m11+30,m13=m12+31"
  39. call set /a "_RET_=%y%*365+%y1%+%%m%2%%+%3"
  40. goto :eof
  41. rem 获取某年里某个月有几天 _RET_[28-31]:get_monthday(year,month)
  42. :get_monthday
  43. set /a "m1=31"
  44. call :check_r %1 && (set /a m2=29) || (set /a m2=28)
  45. set /a "m3=31,m4=30,m5=31,m6=30,m7=31,m8=31,m9=30,m10=31,m11=30,m12=31"
  46. call set "_RET_=%%m%2%%"
  47. goto :eof
  48. rem 判断闰年 BOOL:check_r(year)
  49. :check_r
  50. set /a "1/(%1%%400)" >nul 2>nul || (exit /b 0)
  51. set /a "1/(%1%%100)" >nul 2>nul && (set /a "1/(%1%%4)" >nul 2>nul && (exit /b 1) || (exit /b 0) ) || (exit /b 1)
  52. goto :eof
复制代码

作者: new_user    时间: 5 天前 15:09

# 获取当前日期
$currentDate = Get-Date

# 获取本月的第一天和最后一天
$firstDayOfThisMonth = (Get-Date -Year $currentDate.Year -Month $currentDate.Month -Day 1)
$lastDayOfThisMonth = $firstDayOfThisMonth.AddMonths(1).AddDays(-1)

# 获取下月的第一天和最后一天
$firstDayOfNextMonth = $firstDayOfThisMonth.AddMonths(1)
$lastDayOfNextMonth = $firstDayOfNextMonth.AddMonths(1).AddDays(-1)

# 定义文件夹路径(根据需要修改)
$folderBasePath = "."

# 函数:创建文件夹
function CreateFolder ($date) {
    $folderName = $date.ToString("yyyy-MM-dd")
    $folderPath = "$folderBasePath\$folderName"
   
    if (-not (Test-Path -Path $folderPath)) {
        New-Item -Path $folderPath -ItemType Directory
        Write-Host "文件夹 '$folderName' 已创建!"
    } else {
        Write-Host "文件夹 '$folderName' 已经存在!"
    }
}

# 遍历本月的每一天,从今天开始
$currentDay = $currentDate
while ($currentDay -le $lastDayOfThisMonth) {
    if ($currentDay.DayOfWeek -ne 'Saturday' -and $currentDay.DayOfWeek -ne 'Sunday') {
        CreateFolder $currentDay
    }
    $currentDay = $currentDay.AddDays(1)
}

# 遍历下月的每一天
$currentDay = $firstDayOfNextMonth
while ($currentDay -le $lastDayOfNextMonth) {
    if ($currentDay.DayOfWeek -ne 'Saturday' -and $currentDay.DayOfWeek -ne 'Sunday') {
        CreateFolder $currentDay
    }
    $currentDay = $currentDay.AddDays(1)
}
作者: aloha20200628    时间: 5 天前 15:29

回复 1# kmcc123

关键是两个算点》一是判断某天是星期几,二是判断某年是否为闰年(即2月份有29天),前者用 zeller 公式判断至为简捷,后者采用国际标准判据。以下代码存为 test.bat 运行,当前代码中假定目标年份=2024,目标月份=2(均可在代码中第2行自定义),结果会在当前目录下生成 2024\2024-2\2024-2-1, ..., 2024\2024-2\2024-2-29 共21个子目录,其中排除了周六-周日...
  1. @echo off &setlocal enabledelayedexpansion
  2. set/a "y=_y=2024, m=_m=2"
  3. set/a "m1=m3=m5=m7=m8=m10=m12=31,m2=28,m4=m6=m9=m11=30"
  4. set/a "y1=y%%4,y2=y%%100,y3=y%%400"
  5. if %y1% equ 0 if %y2% neq 0 (set m2=29) else if %y3% equ 0 (set m2=29)
  6. if %m% lss 3 set/a "_y-=1,_m+=12"
  7. for /l %%d in (1,1,!m%m%!) do for /f %%m in (
  8.    'set/a "w=(%%d+2*%_m%+3*(%_m%+1)/5+%_y%+%_y%/4-%_y%/100+%_y%/400)%%7,w+=1" '
  9. ) do if %%m lss 6 md "%y%\%y%-%m%\%y%-%m%-%%d" 2>nul
  10. endlocal&pause&exit/b
复制代码

作者: kmcc123    时间: 4 天前 11:23

多谢各好友指导
作者: 77七    时间: 前天 17:29

  1. @echo off & cd /d "%~dp0" & fltmc >nul || powershell -Command "Start-Process '%~f0' -Verb RunAs" && exit /b
  2. :: 设置起始年份和结束年份
  3. set START_YEAR=2024
  4. set END_YEAR=2024
  5. :: 设置起始月份和结束月份
  6. set START_MONTH=11
  7. set END_MONTH=12
  8. set datenow=%date:~0,10%
  9. setlocal enabledelayedexpansion
  10. (for /l %%l in (%START_YEAR% 1 %END_YEAR%) do (
  11. for /l %%m in (1%START_MONTH% 1 1%END_MONTH%) do (
  12. set m=%%m
  13. for /l %%n in (101 1 131) do (
  14. set d=%%n
  15. echo %%l/!m:~-2!/!d:~-2!|date
  16. if not errorlevel 1 (
  17. if "!date:六=!" equ "!date!" (
  18. if "!date:日=!" equ "!date!" (
  19. md "%%l\%%l-!m:~-2!\%%l-!m:~-2!-!d:~-2!"
  20. )
  21. )
  22. )
  23. )
  24. )
  25. )) 1>nul 2>nul
  26. endlocal
  27. echo %datenow%|date 1>nul 2>nul
  28. pause
复制代码

短暂的修改下系统日期,获取到周几,可能会影响其它程序




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2