Board logo

标题: [日期时间] [已解决]批处理怎样建立一个以当前年份、周别、星期为名的文件夹? [打印本页]

作者: zilu63    时间: 2011-8-8 15:25     标题: [已解决]批处理怎样建立一个以当前年份、周别、星期为名的文件夹?

需要分两步来做:

1.自动建立一个以当前年份、周别、星期为名的文件夹,如今天是2011年第33周星期一,则自动根据当前日期建立文件夹名称为:2011_33_MON

2.将特定文件拷入此文件夹,比如*.csv. 如何引用该段代码。

感谢!

没想到我的问题这么短时间就有这么多专业的朋友们帮助指点迷津,真是太感动了.太激动了.

为了表示谢意,只能赠予积分,但权限只能赠1分,一份心意,望笑纳.
作者: wrove    时间: 2011-8-8 21:04

下面是一部分代码,这个用批处理解决着实是相当的难搞
  1. @Echo off&Color a&SetLocal EnableDelayedExpansion
  2. Call :Array WeekDayNames Mon Tue Wed Thu Fri Sat Sun
  3. ::For /l %%a IN (0 1 %WeekDayNames%) DO Echo !WeekDayNames[%%a]!
  4. Call :Array MonthDays 31 30 31 30 31 30 31 31 30 31 30
  5. ::For /l %%a IN (0 1 %MonthDays%) DO Echo !MonthDays[%%a]!
  6. Pause
  7. :Array
  8. Rem 将函数调用时的所有参数(除第一个外)处理成一个参数数组
  9. Rem 参数ArrayName:要得到的数组的数组名
  10. Rem 返回值%_Name%[i]:由第一个之后的参数组成的数组
  11. Rem 返回值%_Name%:得到的数组的最大下标
  12. Set _Name=%~1
  13. Set _Index=-1
  14. :BeginArray
  15. For %%a IN (%*) DO (
  16. Set %_Name%[!_Index!]=%%a
  17. Set /a _Index+=1
  18. )
  19. Set /a %_Name%=%_Index%-1
  20. :EndArray
  21. Set %_Name%[-1]=
  22. Set _Name=
  23. Set _Index=
  24. Goto :EOF
复制代码

作者: lfoqtal    时间: 2011-8-8 21:18

主要是周难算,每年起始不同平闰不同
作者: wrove    时间: 2011-8-8 21:26

补充:
  1. @Echo off&Color a&SetLocal EnableDelayedExpansion
  2. Call :Array WeekDayNames Mon Tue Wed Thu Fri Sat Sun
  3. ::For /l %%a IN (0 1 %WeekDayNames%) DO Echo !WeekDayNames[%%a]!
  4. Call :Array WeekDays 一 二 三 四 五 六 日
  5. ::For /l %%a IN (0 1 %WeekDays%) DO Echo !WeekDays[%%a]!
  6. Call :Array MonthDays 31 30 31 30 31 30 31 31 30 31 30
  7. ::For /l %%a IN (0 1 %MonthDays%) DO Echo !MonthDays[%%a]!
  8. Call :Split "%Date%" " " "ds"
  9. Set WeekDayName=%ds[1]%
  10. Call :Split "%ds[0]%" "/" "dss"
  11. Set Year=%dss[0]%
  12. Set Month=%dss[1]%
  13. Set Day=%dss[2]%
  14. Set dss=
  15. Set ds=
  16. Set WeekDayName=%WeekDayName:~1,1%
  17. For /l %%a IN (0 1 %WeekDays%) DO (
  18. If "!WeekDays[%%a]!"=="%WeekDayName%" (
  19. Set WeekDayName=!WeekDayNames[%%a]!
  20. Goto :Next
  21. )
  22. )
  23. :Next
  24. ::Echo %WeekDayName%&Echo %Year%&Echo %Month%&Echo %Day%
  25. Pause
  26. :Array
  27. Rem 将函数调用时的所有参数(除第一个外)处理成一个参数数组
  28. Rem 参数ArrayName:要得到的数组的数组名
  29. Rem 返回值%_Name%[i]:由第一个之后的参数组成的数组
  30. Rem 返回值%_Name%:得到的数组的最大下标
  31. Set _Name=%~1
  32. Set _Index=-1
  33. :BeginArray
  34. For %%a IN (%*) DO (
  35. Set %_Name%[!_Index!]=%%a
  36. Set /a _Index+=1
  37. )
  38. Set /a %_Name%=%_Index%-1
  39. :EndArray
  40. Set %_Name%[-1]=
  41. Set _Name=
  42. Set _Index=
  43. Goto :EOF
  44. :Split
  45. Rem 对字符串用指定的分隔符分隔,计算分隔得到的项数
  46. Rem 参数_ItemsStr:要进行解析的字符串
  47. Rem 参数_DelimterChar:单字符的分隔符
  48. Rem 参数_Name:字符串分解后得到的数组的数组名
  49. Rem 返回值%_Name%[i]:保存分解得到的数组的第i项,索引从零开始
  50. Rem 返回值%_Name%:保存数组的最大索引
  51. Set _ItemsStr=%~1
  52. Set _DelimterChar=%~2
  53. Set _Name=%~3
  54. Set _n=1
  55. Set _Index=0
  56. :BeginSplit
  57. For /f "tokens=%_n% delims=%_DelimterChar%" %%a IN ("%_ItemsStr%") DO (
  58. If NOT "%%a"=="" (
  59. Set %_Name%[%_Index%]=%%a
  60. Set /a _n+=1
  61. Set /a _Index+=1
  62. Goto :BeginSplit
  63. )
  64. )
  65. :EndSplit
  66. Set /a %_Name%=%_Index%-1
  67. Set _n=
  68. Set _Index=
  69. Set _ItemsStr=
  70. Set _DelimterChar=
  71. Set _Name=
  72. Goto :EOF
复制代码

作者: wrove    时间: 2011-8-8 22:52

目录名已经得到了,剩下的自己改改:
  1. @Echo off&Color a&SetLocal EnableDelayedExpansion
  2. Call :Array WeekDayNames Mon Tue Wed Thu Fri Sat Sun
  3. ::For /l %%a IN (0 1 %WeekDayNames%) DO Echo !WeekDayNames[%%a]!
  4. Call :Array WeekDays 一 二 三 四 五 六 日
  5. ::For /l %%a IN (0 1 %WeekDays%) DO Echo !WeekDays[%%a]!
  6. Call :Array MonthDays 31 30 31 30 31 30 31 31 30 31 30 31
  7. ::For /l %%a IN (0 1 %MonthDays%) DO Echo !MonthDays[%%a]!
  8. Call :Split "%Date%" " " "ds"
  9. Set WeekDayName=%ds[1]%
  10. Call :Split "%ds[0]%" "/" "dss"
  11. Set Year=%dss[0]%
  12. Set Month=%dss[1]%
  13. Set Day=%dss[2]%
  14. Rem 去除前导零
  15. If %Month:~0,1% equ 0 Set Month=%Month:~1,1%
  16. If %Day:~0,1% equ 0 Set Day=%Day:~1,1%
  17. Set dss=
  18. Set ds=
  19. Set WeekDayName=%WeekDayName:~1,1%
  20. For /l %%a IN (0 1 %WeekDays%) DO (
  21. If "!WeekDays[%%a]!"=="%WeekDayName%" (
  22. Set WeekDayName=!WeekDayNames[%%a]!
  23. Goto :Next
  24. )
  25. )
  26. :Next
  27. ::Echo %WeekDayName%&Echo %Year%&Echo %Month%&Echo %Day%
  28. Rem 计算公元1年1月1日到去年结束总共的天数
  29. Set /a Year-=1
  30. Set /a DaysCount=365*%Year%
  31. For /l %%a IN (4 4 %Year%) DO (
  32. Rem 预设为True,因为%%a一定能被四整除
  33. Set IsLeap=True
  34. Set /a Mod1=%year%%%100
  35. Set /a Mod2=%Year%%%400
  36. Set /a Mod3=%Year%%%128
  37. Rem 排除能被100整除但不能被400整除的年份
  38. If !Mod1! equ 0 If !Mod2! neq 0 Set IsLeap=False
  39. Rem 每128年废一润年(来自百科)
  40. If !Mod3! equ 0 Set IsLeap=False
  41. If !IsLeap!==True Set /a DaysCount+=1
  42. )
  43. ::Echo %DaysCount%
  44. Rem 还原Year
  45. Set /a Year+=1
  46. Rem 计算今年以来的总天数
  47. Set /a Month-=2
  48. Set Days=0
  49. For /l %%a IN (0 1 %Month%) DO (
  50. Set /a Days+=!MonthDays[%%a]!
  51. )
  52. Set /a Days+=%Day%
  53. Call :IsLeap %Year%
  54. If %IsLeap%==True Set /a Days+=1
  55. ::Echo %Days%
  56. Rem 还原Month
  57. Set /a Month+=2
  58. Set /a Mod=%Days%%%7
  59. Set /a Div=%Days%/7
  60. If %Days% leq 7 (
  61. Set Week=1
  62. ) Else (
  63. Rem 当然你也可以有其他选择,具体情况自己改一下判断条件It's easy!
  64. If %Mod% geq 4 Set /a Week=%Div%+1
  65. )
  66. Set DirName=%Year%_%Week%_%WeekDayName%
  67. ::Echo %DirName%
  68. Pause
  69. :IsLeap
  70. Rem 判断某一年是不是润年,返回值总是IsLeap
  71. Rem 参数_Year:要判断的年份
  72. Rem 返回值IsLeap:润年则为True,平年则为False
  73. Set _Year=%~1
  74. :BeginIsLeap
  75. Rem 预设为False
  76. Set IsLeap=False
  77. Set /a _Mod1=%_Year%%%4
  78. Set /a _Mod2=%_year%%%100
  79. Set /a _Mod3=%_Year%%%400
  80. Set /a _Mod4=%_Year%%%128
  81. Rem 能被四整除为润年
  82. If %_Mod1% equ 0 (
  83. Set IsLeap=True
  84. Rem 排除能被100整除但不能被400整除的年份
  85. If %_Mod2% equ 0 (
  86. If %_Mod3% neq 0 Set IsLeap=False
  87. )
  88. Rem 每128年废一润年(来自百科)
  89. If %_Mod4% equ 0 Set IsLeap=False
  90. )
  91. :EndIsLeap
  92. Set _Year=
  93. Set _Mod1=
  94. Set _Mod2=
  95. Set _Mod3=
  96. Set _Mod4=
  97. Goto :Eof
  98. :Array
  99. Rem 将函数调用时的所有参数(除第一个外)处理成一个参数数组
  100. Rem 参数ArrayName:要得到的数组的数组名
  101. Rem 返回值%_Name%[i]:由第一个之后的参数组成的数组
  102. Rem 返回值%_Name%:得到的数组的最大下标
  103. Set _Name=%~1
  104. Set _Index=-1
  105. :BeginArray
  106. For %%a IN (%*) DO (
  107. Set %_Name%[!_Index!]=%%a
  108. Set /a _Index+=1
  109. )
  110. Set /a %_Name%=%_Index%-1
  111. :EndArray
  112. Set %_Name%[-1]=
  113. Set _Name=
  114. Set _Index=
  115. Goto :EOF
  116. :Split
  117. Rem 对字符串用指定的分隔符分隔,计算分隔得到的项数
  118. Rem 参数_ItemsStr:要进行解析的字符串
  119. Rem 参数_DelimterChar:单字符的分隔符
  120. Rem 参数_Name:字符串分解后得到的数组的数组名
  121. Rem 返回值%_Name%[i]:保存分解得到的数组的第i项,索引从零开始
  122. Rem 返回值%_Name%:保存数组的最大索引
  123. Set _ItemsStr=%~1
  124. Set _DelimterChar=%~2
  125. Set _Name=%~3
  126. Set _n=1
  127. Set _Index=0
  128. :BeginSplit
  129. For /f "tokens=%_n% delims=%_DelimterChar%" %%a IN ("%_ItemsStr%") DO (
  130. If NOT "%%a"=="" (
  131. Set %_Name%[%_Index%]=%%a
  132. Set /a _n+=1
  133. Set /a _Index+=1
  134. Goto :BeginSplit
  135. )
  136. )
  137. :EndSplit
  138. Set /a %_Name%=%_Index%-1
  139. Set _n=
  140. Set _Index=
  141. Set _ItemsStr=
  142. Set _DelimterChar=
  143. Set _Name=
  144. Goto :EOF
复制代码

作者: hanyeguxing    时间: 2011-8-8 23:08

本帖最后由 hanyeguxing 于 2011-8-9 10:13 编辑
  1. @echo off&set/a Y=%date:~0,4%,M=1%date:~5,2%%%-101,D=1%date:~8,2%%%100
  2. for /l %%a in (1,1,%M%) do set/a "D+=30+(%%a-%%a/8)%%2+!(%%a-2)*(!(Y%%4)&!(!(Y%%100))|!(Y%%400)-2)"
  3. set/a T=(Y-1)*365+Y/4-Y/100+Y/400+1,D+=T-1,M=D/7-T/7+1,"K=!(D%%7)*7+D%%7"
  4. for /f "tokens=%K%" %%a in ("Mon Tue Wed Thu Fri Sat Sun") do set K=%Y%_%M%_%%a
  5. md "%K%\" 2>nul
  6. copy "c:\*.csv" "%K%\"
复制代码
  1. @echo off&set/a Y=%date:~0,4%,M=1%date:~5,2%%%-101,K=(Y-1)*365+Y/4-Y/100+Y/400+1,"D=K-1+(M+1)/2+!(M-8)+!(M-10)+30*M+1%date:~8,2%%%100+!!(M/2)*(!(Y%%4)&!(!(Y%%100))|!(Y%%400)-2)",M=D/7-K/7+1,"K=!(D%%7)*7+D%%7"
  2. for /f "tokens=%K%" %%a in ("Mon Tue Wed Thu Fri Sat Sun") do set K=%Y%_%M%_%%a
  3. md "%K%\" 2>nul
  4. copy "c:\*.csv" "%K%\"
复制代码
要求%date%为标准格式,星期语言为任意
作者: ArdentMan    时间: 2011-8-9 00:38

本帖最后由 ArdentMan 于 2011-8-9 00:40 编辑

VBS方案:
  1. Dim NowYear, NowWeek, NowWeekDay, Arr, FolderName, FSO, Path
  2. Arr = split("Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday", ",")
  3. NowYear = Year(Now())
  4. NowWeek = DateDiff("ww", NowYear & "-1-1", Now())
  5. NowWeekDay = Arr(Weekday(Now()))
  6. FolderName = NowYear & "_" & NowWeek & "_" & NowWeekDay
  7. Set FSO = CreateObject("Scripting.FileSystemObject")
  8. Path = CreateObject("Wscript.Shell").CurrentDirectory & "\"'如不是当前目录请自行修改为绝对或相对路径
  9. FSO.CreateFolder FolderName
  10. For Each file In FSO.GetFolder(Path).Files
  11.   If LCase(FSO.GetExtensionName(file)) = "csv" Then FSO.CopyFile file, FolderName & "\"
  12. Next
  13. Set FSO = Nothing
  14. MsgBox "拷备完成" ,, "ArdentMan友情提示"
复制代码

作者: zilu63    时间: 2011-8-9 08:55

十分感谢各位的热心帮助,
目前hanyeguxing  和ArdentMan  两位的代码完全符合我的要求.

感谢,感谢!
又学了一招,看来批处理和VBS真是博大精深啊.
作者: CrLf    时间: 2011-8-9 13:06

另一种周数算法:
  1. @echo off
  2. set /a "k=1%date:~5,2%-101","y=%date:~,4%","d=y/100","s=y%%100","d=30*k-~k/2+1%date:~8,2%-101+(!!(k/2))*(!(y%%4)-!(y%%100)+!(y%%400)-2)","s=d/7+!!(d%%7)","k=(y+y/4-y/100+y/400+d)%%7"
  3. for /f "tokens=%K%" %%a in ("Mon Tue Wed Thu Fri Sat Sun") do md "%Y%_%M%_%%a" 2>nul
  4. copy "c:\*.csv" "%K%\"
复制代码

作者: plp626    时间: 2011-8-12 20:50

本帖最后由 plp626 于 2011-8-15 22:55 编辑
  1. ::蔡勒公式改进版算星期:
  2. set dt=%date%
  3. ::年月日格式例子: 2011-08-12 (命令行下测试)
  4. set/a y=%dt:~,4%,m=1%dt:~5,2%-100,d=1%dt:~8,2%-100
  5. if %m% leq 2 set/a m+=12,y-=1
  6. set/a w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7+1
  7. echo %dt%这一天,星期%w%
复制代码
http://baike.baidu.com/view/598757.htm
===================
  1. :: 定义 _weekday函数,入口参数#1,#2,#3;返回变量名##;
  2. :: 入口参数格式:以2012年1月1日为例,则#1=2012,#2=1,#3=1
  3. set _weekday=set/a"##=(#2-3)>>31,#2+=-12*##,#1+=##,##=(#3+2*#2+3*(#2+1)/5+#1+#1/4-#1/100+#1/400)%%%%7+1"
  4. :: 使用举例:
  5. set/a #1=2012,#2=1,#3=1
  6. %_weekday%
  7. set ##
复制代码

作者: CrLf    时间: 2011-8-12 21:21

本帖最后由 CrLf 于 2011-8-12 23:08 编辑

蔡勒公式我也尝试过,但是百思不得其解它怎么总是不准,后来发现这是因为它是以浮点运算为基础的...
浮点还得靠 vbs:
  1. y = year(now)
  2. m = month(now)
  3. d = day(now)
  4. wscript.echo (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)mod 7
复制代码
不过话说回来,vbs 自带星期函数,也没必要用公式...
  1. msgbox weekday(now)
复制代码





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