标题: [日期时间] [已解决]批处理怎样建立一个以当前年份、周别、星期为名的文件夹? [打印本页]
作者: zilu63 时间: 2011-8-8 15:25 标题: [已解决]批处理怎样建立一个以当前年份、周别、星期为名的文件夹?
需要分两步来做:
1.自动建立一个以当前年份、周别、星期为名的文件夹,如今天是2011年第33周星期一,则自动根据当前日期建立文件夹名称为:2011_33_MON
2.将特定文件拷入此文件夹,比如*.csv. 如何引用该段代码。
感谢!
没想到我的问题这么短时间就有这么多专业的朋友们帮助指点迷津,真是太感动了.太激动了.
为了表示谢意,只能赠予积分,但权限只能赠1分,一份心意,望笑纳.
作者: wrove 时间: 2011-8-8 21:04
下面是一部分代码,这个用批处理解决着实是相当的难搞- @Echo off&Color a&SetLocal EnableDelayedExpansion
- Call :Array WeekDayNames Mon Tue Wed Thu Fri Sat Sun
- ::For /l %%a IN (0 1 %WeekDayNames%) DO Echo !WeekDayNames[%%a]!
- Call :Array MonthDays 31 30 31 30 31 30 31 31 30 31 30
- ::For /l %%a IN (0 1 %MonthDays%) DO Echo !MonthDays[%%a]!
-
- Pause
-
- :Array
- Rem 将函数调用时的所有参数(除第一个外)处理成一个参数数组
- Rem 参数ArrayName:要得到的数组的数组名
- Rem 返回值%_Name%[i]:由第一个之后的参数组成的数组
- Rem 返回值%_Name%:得到的数组的最大下标
- Set _Name=%~1
- Set _Index=-1
- :BeginArray
- For %%a IN (%*) DO (
- Set %_Name%[!_Index!]=%%a
- Set /a _Index+=1
- )
- Set /a %_Name%=%_Index%-1
- :EndArray
- Set %_Name%[-1]=
- Set _Name=
- Set _Index=
- Goto :EOF
复制代码
作者: lfoqtal 时间: 2011-8-8 21:18
主要是周难算,每年起始不同平闰不同
作者: wrove 时间: 2011-8-8 21:26
补充:- @Echo off&Color a&SetLocal EnableDelayedExpansion
- Call :Array WeekDayNames Mon Tue Wed Thu Fri Sat Sun
- ::For /l %%a IN (0 1 %WeekDayNames%) DO Echo !WeekDayNames[%%a]!
- Call :Array WeekDays 一 二 三 四 五 六 日
- ::For /l %%a IN (0 1 %WeekDays%) DO Echo !WeekDays[%%a]!
- Call :Array MonthDays 31 30 31 30 31 30 31 31 30 31 30
- ::For /l %%a IN (0 1 %MonthDays%) DO Echo !MonthDays[%%a]!
- Call :Split "%Date%" " " "ds"
- Set WeekDayName=%ds[1]%
- Call :Split "%ds[0]%" "/" "dss"
- Set Year=%dss[0]%
- Set Month=%dss[1]%
- Set Day=%dss[2]%
- Set dss=
- Set ds=
- Set WeekDayName=%WeekDayName:~1,1%
- For /l %%a IN (0 1 %WeekDays%) DO (
- If "!WeekDays[%%a]!"=="%WeekDayName%" (
- Set WeekDayName=!WeekDayNames[%%a]!
- Goto :Next
- )
- )
- :Next
- ::Echo %WeekDayName%&Echo %Year%&Echo %Month%&Echo %Day%
- Pause
-
- :Array
- Rem 将函数调用时的所有参数(除第一个外)处理成一个参数数组
- Rem 参数ArrayName:要得到的数组的数组名
- Rem 返回值%_Name%[i]:由第一个之后的参数组成的数组
- Rem 返回值%_Name%:得到的数组的最大下标
- Set _Name=%~1
- Set _Index=-1
- :BeginArray
- For %%a IN (%*) DO (
- Set %_Name%[!_Index!]=%%a
- Set /a _Index+=1
- )
- Set /a %_Name%=%_Index%-1
- :EndArray
- Set %_Name%[-1]=
- Set _Name=
- Set _Index=
- Goto :EOF
-
- :Split
- Rem 对字符串用指定的分隔符分隔,计算分隔得到的项数
- Rem 参数_ItemsStr:要进行解析的字符串
- Rem 参数_DelimterChar:单字符的分隔符
- Rem 参数_Name:字符串分解后得到的数组的数组名
- Rem 返回值%_Name%[i]:保存分解得到的数组的第i项,索引从零开始
- Rem 返回值%_Name%:保存数组的最大索引
- Set _ItemsStr=%~1
- Set _DelimterChar=%~2
- Set _Name=%~3
- Set _n=1
- Set _Index=0
- :BeginSplit
- For /f "tokens=%_n% delims=%_DelimterChar%" %%a IN ("%_ItemsStr%") DO (
- If NOT "%%a"=="" (
- Set %_Name%[%_Index%]=%%a
- Set /a _n+=1
- Set /a _Index+=1
- Goto :BeginSplit
- )
- )
- :EndSplit
- Set /a %_Name%=%_Index%-1
- Set _n=
- Set _Index=
- Set _ItemsStr=
- Set _DelimterChar=
- Set _Name=
- Goto :EOF
复制代码
作者: wrove 时间: 2011-8-8 22:52
目录名已经得到了,剩下的自己改改:复制代码
作者: hanyeguxing 时间: 2011-8-8 23:08
本帖最后由 hanyeguxing 于 2011-8-9 10:13 编辑
- @echo off&set/a Y=%date:~0,4%,M=1%date:~5,2%%%-101,D=1%date:~8,2%%%100
- 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)"
- 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"
- for /f "tokens=%K%" %%a in ("Mon Tue Wed Thu Fri Sat Sun") do set K=%Y%_%M%_%%a
- md "%K%\" 2>nul
- copy "c:\*.csv" "%K%\"
复制代码
- @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"
- for /f "tokens=%K%" %%a in ("Mon Tue Wed Thu Fri Sat Sun") do set K=%Y%_%M%_%%a
- md "%K%\" 2>nul
- copy "c:\*.csv" "%K%\"
复制代码
要求%date%为标准格式,星期语言为任意
作者: ArdentMan 时间: 2011-8-9 00:38
本帖最后由 ArdentMan 于 2011-8-9 00:40 编辑
VBS方案:- Dim NowYear, NowWeek, NowWeekDay, Arr, FolderName, FSO, Path
- Arr = split("Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday", ",")
- NowYear = Year(Now())
- NowWeek = DateDiff("ww", NowYear & "-1-1", Now())
- NowWeekDay = Arr(Weekday(Now()))
- FolderName = NowYear & "_" & NowWeek & "_" & NowWeekDay
- Set FSO = CreateObject("Scripting.FileSystemObject")
- Path = CreateObject("Wscript.Shell").CurrentDirectory & "\"'如不是当前目录请自行修改为绝对或相对路径
- FSO.CreateFolder FolderName
- For Each file In FSO.GetFolder(Path).Files
- If LCase(FSO.GetExtensionName(file)) = "csv" Then FSO.CopyFile file, FolderName & "\"
- Next
- Set FSO = Nothing
- MsgBox "拷备完成" ,, "ArdentMan友情提示"
复制代码
作者: zilu63 时间: 2011-8-9 08:55
十分感谢各位的热心帮助,
目前hanyeguxing 和ArdentMan 两位的代码完全符合我的要求.
感谢,感谢!
又学了一招,看来批处理和VBS真是博大精深啊.
作者: CrLf 时间: 2011-8-9 13:06
另一种周数算法:- @echo off
- 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"
- for /f "tokens=%K%" %%a in ("Mon Tue Wed Thu Fri Sat Sun") do md "%Y%_%M%_%%a" 2>nul
- copy "c:\*.csv" "%K%\"
复制代码
作者: plp626 时间: 2011-8-12 20:50
本帖最后由 plp626 于 2011-8-15 22:55 编辑
- ::蔡勒公式改进版算星期:
- set dt=%date%
- ::年月日格式例子: 2011-08-12 (命令行下测试)
- set/a y=%dt:~,4%,m=1%dt:~5,2%-100,d=1%dt:~8,2%-100
- if %m% leq 2 set/a m+=12,y-=1
- set/a w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7+1
- echo %dt%这一天,星期%w%
复制代码
http://baike.baidu.com/view/598757.htm
===================- :: 定义 _weekday函数,入口参数#1,#2,#3;返回变量名##;
- :: 入口参数格式:以2012年1月1日为例,则#1=2012,#2=1,#3=1
- 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"
-
- :: 使用举例:
- set/a #1=2012,#2=1,#3=1
- %_weekday%
- set ##
复制代码
作者: CrLf 时间: 2011-8-12 21:21
本帖最后由 CrLf 于 2011-8-12 23:08 编辑
蔡勒公式我也尝试过,但是百思不得其解它怎么总是不准,后来发现这是因为它是以浮点运算为基础的...
浮点还得靠 vbs:- y = year(now)
- m = month(now)
- d = day(now)
- wscript.echo (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)mod 7
复制代码
不过话说回来,vbs 自带星期函数,也没必要用公式...复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |