Board logo

标题: [日期时间] 批处理建立目录,无法正常运行 [打印本页]

作者: zhlgx    时间: 2024-10-1 12:07     标题: 批处理建立目录,无法正常运行

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :: 提示用户输入月份
  4. echo 请输入月份数字(1-12):
  5. set /p month_input=
  6. :: 检查输入是否合法
  7. if not defined month_input (
  8.     echo 请输入有效的月份数字(1-12)!
  9.     exit /b
  10. )
  11. if !month_input! lss 1 (
  12.     echo 请输入有效的月份数字(1-12)!
  13.     exit /b
  14. )
  15. if !month_input! gtr 12 (
  16.     echo 请输入有效的月份数字(1-12)!
  17.     exit /b
  18. )
  19. :: 设置月份变量
  20. set month_num=!month_input!
  21. set month_str=!month_num!
  22. :: 如果月份小于 10,则前面加 0
  23. if !month_num! lss 10 (
  24.     set month_str=0!month_num!
  25. )
  26. :: 获取当前年份
  27. for /f "tokens=2 delims==" %%a in ('wmic os get localdatetime /value') do (
  28.     set datetime=%%a
  29. )
  30. set year=%datetime:~0,4%
  31. :: 判断是否为闰年
  32. set is_leap_year=0
  33. if !year! %% 400 equ 0 (
  34.     set is_leap_year=1
  35. ) else if !year! %% 100 neq 0 (
  36.     if !year! %% 4 equ 0 (
  37.         set is_leap_year=1
  38.     )
  39. )
  40. pause
  41. :: 根据用户输入的月份创建对应的目录
  42. set main_dir=!year!年!month_str!月
  43. md "!main_dir!" >nul 2>nul
  44. pause
  45. :: 根据月份创建子目录
  46. if !month_num! equ 2 (
  47.     if !is_leap_year! equ 1 (
  48.         for /l %%d in (1,1,29) do (
  49.             set day=%%d
  50.             if %%d lss 10 set day=0%%d
  51.             md "!main_dir!\%%day%日" >nul 2>nul
  52.         )
  53.     ) else (
  54.         for /l %%d in (1,1,28) do (
  55.             set day=%%d
  56.             if %%d lss 10 set day=0%%d
  57.             md "!main_dir!\%%day%日" >nul 2>nul
  58.         )
  59.     )
  60. ) else if !month_num! equ 4 (
  61.     for /l %%d in (1,1,30) do (
  62.         set day=%%d
  63.         if %%d lss 10 set day=0%%d
  64.         md "!main_dir!\%%day%日" >nul 2>nul
  65.     )
  66. ) else if !month_num! equ 6 (
  67.     for /l %%d in (1,1,30) do (
  68.         set day=%%d
  69.         if %%d lss 10 set day=0%%d
  70.         md "!main_dir!\%%day%日" >nul 2>nul
  71.     )
  72. ) else if !month_num! equ 9 (
  73.     for /l %%d in (1,1,30) do (
  74.         set day=%%d
  75.         if %%d lss 10 set day=0%%d
  76.         md "!main_dir!\%%day%日" >nul 2>nul
  77.     )
  78. ) else if !month_num! equ 11 (
  79.     for /l %%d in (1,1,30) do (
  80.         set day=%%d
  81.         if %%d lss 10 set day=0%%d
  82.         md "!main_dir!\%%day%日" >nul 2>nul
  83.     )
  84. ) else (
  85.     for /l %%d in (1,1,31) do (
  86.         set day=%%d
  87.         if %%d lss 10 set day=0%%d
  88.         md "!main_dir!\%%day%日" >nul 2>nul
  89.     )
  90. )
  91. echo Folder created.
  92. :: 复制文件到对应月份的目录
  93. copy "%CD%\1.xlsx" "!main_dir!\\" >nul 2>nul
  94. exit /b
复制代码
无法运行,提示:
请输入月份数字(1-12):
1
此时不应有 %。
作者: 77七    时间: 2024-10-1 13:01

  1. :: 判断是否为闰年
  2. set is_leap_year=0
  3. if !year! %% 400 equ 0 (
复制代码

需要先用 set /a 计算,再比较

  1. md "!main_dir!\%%day%日"
复制代码

应为
  1. md "!main_dir!\!day!日"
复制代码

作者: 77七    时间: 2024-10-1 13:13

相关方法 http://bbs.bathome.net/viewthread.php?tid=69590
  1. @echo off
  2. rem 保存为ansi
  3. for /f %%a in ('wmic os get localdatetime ^|findstr [0-9]') do set year=%%a&call set year=%%year:~0,4%%
  4. set/a num=!(year%%4) ^& !(!(year%%100)) ^| !(year%%400),_2=28+num,_1=_3=_5=_7=_8=_10=_12=31,_4=_6=_9=_11=30
  5. :re
  6. set /p m=input:
  7. setlocal enabledelayedexpansion
  8. if not defined _!m! (
  9. echo 请输入有效的月份数字(1-12)!
  10. endlocal
  11. set m=
  12. goto :re
  13. )
  14. set "#m=0!m!"
  15. for /l %%l in (1,1,!_%m%!) do (
  16. set l=0%%l
  17. md "%year%年!#m:~-2!月\!l:~-2!日"
  18. )
  19. copy "%CD%\1.xlsx" "%year%年!#m:~-2!月\"
  20. endlocal
  21. pause
复制代码

作者: aloha20200628    时间: 2024-10-2 10:20

本帖最后由 aloha20200628 于 2024-10-2 10:42 编辑

回复 1# zhlgx

一楼代码存在变量引用等错误,现重写一个简化版本如下...
主要包含几个处理步骤:检查输入月值的合理性;平闰年2月份天数选择值;大小月份天数选择值;月日值补零占位处理...
  1. @echo off &setlocal enabledelayedexpansion
  2. choice /c 123456789abc /n /m "指定一个月份值 [1,2,3,4,5,6,7,8,9,a,b,c] 其中 a=10,b=11,c=12:"
  3. if !errorlevel! equ 0 (exit/b) else set "m=!errorlevel!"
  4. set "m30=4,6,9,11," &set/a "y=%date:~,4%,r=y%%4"
  5. if !m! equ 2 (set "days=28" &if !r! equ 0 set "days=29") else (
  6. if "!m30:%m%=!"=="!m30!" (set "days=31") else set "days=30")
  7. if !m! leq 9 (set mm=0!m!) else (set mm=!m!)
  8. for /l %%n in (1,1,!days!) do (if %%n leq 9 (md "!y!年!mm!月\0%%n日") else md "!y!年!mm!月\%%n日") 2>nul
  9. endlocal&pause&exit/b
复制代码





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