找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 11432|回复: 5

[日期时间] 批处理如何每月每天排除周六和周日生成日期文件夹?

[复制链接]
发表于 2024-11-17 19:01:59 | 显示全部楼层 |阅读模式
每月每天排除周六和周日生成日期文件夹,好像那里出错,没有排除周六和周日
  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
复制代码
发表于 2024-11-17 19:48:13 | 显示全部楼层
如果你的系统支持powershell的话,感觉用powershell来处理会更方便一点
发表于 2024-11-18 00:37:34 | 显示全部楼层
写了几个通用函数
  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


复制代码

评分

参与人数 1技术 +1 收起 理由
hnfeng + 1 强,厉害!

查看全部评分

发表于 2024-11-18 15:09:14 | 显示全部楼层
# 获取当前日期
$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)
}
发表于 2024-11-18 15:29:09 | 显示全部楼层
回复 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
复制代码
 楼主| 发表于 2024-11-19 11:23:41 | 显示全部楼层
多谢各好友指导
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 07:08 , Processed in 0.019763 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表