批处理 选择截取文件名中的日期移动文件

samwang1 2011-10-28 08:45:31
test1文件夹中有以下文件(3个文件为一组):
CH50_XX_201007071641.csv
CH50_YY_201007071641.csv
CH50_ZZ_201007071641.csv(假设系统为7月)

CH50_XX_201006301641.csv
CH50_YY_201006301641.csv
CH50_ZZ_201006301641.csv

CH50_XX_201006221641.csv
CH50_YY_201006221641.csv
CH50_ZZ_201006221641.csv

现要提取上个月(6月)最后一组文件(日期不一定为30号,只要是上月最后一天的数据)移至文件夹test2中,结果如下:
CH60_XX_201006301641.csv
CH60_YY_201006301641.csv
CH60_ZZ_201006301641.csv

貌似有点复杂 望请高手帮忙 谢谢~!
...全文
577 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuwenzhe 2014-06-10
  • 打赏
  • 举报
回复
能不能他妈的解释一下每句话都什么意思?
Forever_Young 2011-10-30
  • 打赏
  • 举报
回复
你省几个字,回答问题的白费功夫,试试下面的

[code=BatchFile]
echo off
set sp=D:\test1
set dp=D:\test2

echo wscript.echo year(dateadd("m",-1,date))^&right("0"^&month(dateadd("m",-1,date)),2)>"%~dp0tmp.vbs"
for /f "tokens=1,2" %%a in ('cscript /nologo "%~dp0tmp.vbs"') do (set ym=%%a&del "%~dp0tmp.vbs")
setlocal enabledelayedexpansion
for /l %%a in (31,-1,1) do (
set d=0%%a
set d=!d:~-2!
if exist "%sp%\ch50_*_%ym%!d!*.csv" (copy /y "%sp%\ch50_*_%ym%!d!*.csv" "%dp%\ch60_*_%ym%!d!*.csv"&&del "%sp%\ch50_*_%ym%!d!*.csv"&&exit)
)
echo 没有找到目标文件,按任意键退出!
pause>nul
exit
[/code]
Forever_Young 2011-10-30
  • 打赏
  • 举报
回复
把上面的改了一下,那个一行太长了,呵呵

[code=BatchFile]
@echo off
set sp="D:\test1\ch50_*_!ym!!d!*.csv"
set dp="D:\test2\ch60_*_!ym!!d!*.csv"
set tp=%~dp0tmp.vbs
echo wscript.echo year(dateadd("m",-1,date))^&^
right("0"^&month(dateadd("m",-1,date)),2)>"%tp%"
setlocal enabledelayedexpansion
for /f %%a in ('cscript /nologo "%tp%"') do (set ym=%%a&del "%tp%")
for /l %%a in (31,-1,1) do (
set d=0%%a
set d=!d:~-2!
if exist %sp% (copy /y %sp% %dp%&&del /f /q %sp%&&pause&exit)
)
echo 没有找到目标文件,按任意键退出!
pause>nul
exit
[/code]
Forever_Young 2011-10-30
  • 打赏
  • 举报
回复
%~dp0就是批处理所处的路径

right和上面是一句

nologo是不显示cscript的标题信息
samwang1 2011-10-30
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 forever_young 的回复:]
把上面的改了一下,那个一行太长了,呵呵


BatchFile code


@echo off
set sp="D:\test1\ch50_*_!ym!!d!*.csv"
set dp="D:\test2\ch60_*_!ym!!d!*.csv"
set tp=%~dp0tmp.vbs
echo wscript.echo year(dateadd("m",-1,date))^……
[/Quote]
强大啊 可以实现了
不过我想问问你这两句是什么意思
set tp=%~dp0tmp.vbs (%~dp0这没看懂)
echo wscript.echo year(dateadd("m",-1,date))^&^
right("0"^&month(dateadd("m",-1,date)),2)>"%tp%" (right后面是什么意思呢?)
for /f %%a in ('cscript /nologo "%tp%"') do (set ym=%%a&del "%tp%") (nologo这个有什么作用呢?)
Microogle 2011-10-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 samwang1 的回复:]

引用 4 楼 microogle 的回复:
Assembly code


@echo off
set sd=d:\test1\
set dd=d:\test2\

pushd %sd%
rem 转换"2010/07/0x 周x"为"201007",需要根据本机的日期格式修改
set d=%date:/=%
set d=%d:~0,6%
rem 也可手动s……

好像……
[/Quote]

set sd=d:\test1\
set dd=d:\test2\

pushd %sd%
rem 转换"2010/07/0x 周x"为"201007",需要根据本机的日期格式修改
Forever_Young 2011-10-29
  • 打赏
  • 举报
回复
比如你的test1和test2文件夹在D盘,如果今天运行,就把20110930的文件从test1移动到test2

[code=BatchFile]
@echo off
set sp=D:\test1
set dp=D:\test2

more +14 %~0>%~dp0tmp.vbs
for /f %%a in ('cscript /nologo "%~dp0tmp.vbs"') do (set d=%%a&del "%~dp0tmp.vbs")
setlocal enabledelayedexpansion
for /f %%a in ('dir /b /a-d "%sp%\ch50*_%d%*.csv"') do (
set nn=%%a
set nn=!nn:ch50=ch60!
copy /y "%sp%\%%a" "%dp%\!nn!"&&del /f /q "%sp%\%%a"
)
pause
exit

dtmp=year(dateadd("m",-1,date))&"-"&month(dateadd("m",-1,date))&"-"
if isdate(dtmp&"28") then lastmon=dtmp&"28"
if isdate(dtmp&"29") then lastmon=dtmp&"29"
if isdate(dtmp&"30") then lastmon=dtmp&"30"
if isdate(dtmp&"31") then lastmon=dtmp&"31"
wscript.echo year(lastmon)&right("0"&month(lastmon),2)&right("0"&day(lastmon),2)
[/code]
Microogle 2011-10-29
  • 打赏
  • 举报
回复

@echo off
set sd=d:\test1\
set dd=d:\test2\

pushd %sd%
rem 转换"2010/07/0x 周x"为"201007",需要根据本机的日期格式修改
set d=%date:/=%
set d=%d:~0,6%
rem 也可手动set d=201007来实现指定年月

rem n=截至上月文件总数目
for /f "tokens=1 delims=:" %%i in ('dir /b *.csv ^| findstr /iv "%d%" ^| findstr /n .*') do set /a n=%%i

rem 取最后3个文件
set /a n-=3
for /f "skip=%n%" %%i in ('dir /b *.csv ^| findstr /iv "%d%" ^| sort /+8') do move "%%i" "%dd%"
popd
pause
goto :eof

ljc007 2011-10-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mokson 的回复:]
这是典型的字串查找功能,多看看批处理的 findstr 用法吧。
[/Quote]

这是典型的日期计算问题,跟findstr关系不是特别大。
mokson 2011-10-29
  • 打赏
  • 举报
回复
这是典型的字串查找功能,多看看批处理的 findstr 用法吧。
samwang1 2011-10-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 forever_young 的回复:]
引用 5 楼 samwang1 的回复:
我运行了一下 文件可以移动 但是会显示找不到and 文件 并且移动后都会删掉那个tmp.vbs文件吗 这样的话每次移动都要重新建立一个新的vbs文件吗?


这个完全是按照你的描述来做的,如果你提供的信息不完整有可能出点错误,比如我这个脚本只提供了当前时间的判断,也就是以你执行的日期为准减一个月,如果你的文件夹没有对应文件肯定就会提示找不到文件了。……
[/Quote]
不好意思 我没说明白 那个要求是要找到上个月中文件夹日期最大的那个时点的文件组 如果系统是10月的话 test1中9月份的csv中不一定有30号那天的 是选取9月份文件中文件名日期最大的那个文件 有可能是28号等等....
samwang1 2011-10-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ljc007 的回复:]
引用 2 楼 mokson 的回复:
这是典型的字串查找功能,多看看批处理的 findstr 用法吧。


这是典型的日期计算问题,跟findstr关系不是特别大。
[/Quote]
不知道版主能否帮我看看这个怎么弄呢?
samwang1 2011-10-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 forever_young 的回复:]
引用 5 楼 samwang1 的回复:
我运行了一下 文件可以移动 但是会显示找不到and 文件 并且移动后都会删掉那个tmp.vbs文件吗 这样的话每次移动都要重新建立一个新的vbs文件吗?


这个完全是按照你的描述来做的,如果你提供的信息不完整有可能出点错误,比如我这个脚本只提供了当前时间的判断,也就是以你执行的日期为准减一个月,如果你的文件夹没有对应文件肯定就会提示找不到文件了。……
[/Quote]
more +14 %~0>%~dp0tmp.vbs
for /f %%a in ('cscript /nologo "%~dp0tmp.vbs"') do (set d=%%a&del "%~dp0tmp.vbs")
这两句话有点看不明白 能否解释一下呢?
是不是把&del "%~dp0tmp.vbs"这句话删了就不会删掉那个文件了呢?
Forever_Young 2011-10-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 samwang1 的回复:]
我运行了一下 文件可以移动 但是会显示找不到and 文件 并且移动后都会删掉那个tmp.vbs文件吗 这样的话每次移动都要重新建立一个新的vbs文件吗?
[/Quote]

这个完全是按照你的描述来做的,如果你提供的信息不完整有可能出点错误,比如我这个脚本只提供了当前时间的判断,也就是以你执行的日期为准减一个月,如果你的文件夹没有对应文件肯定就会提示找不到文件了。

另外这个批处理如果你要改动,增减行数的话,要注意前面more后面的数字,那个也要相应增减,VBS临时创建没关系,你也可以单独剥离出来,这个看你自己的需求了。
samwang1 2011-10-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 microogle 的回复:]
Assembly code


@echo off
set sd=d:\test1\
set dd=d:\test2\

pushd %sd%
rem 转换"2010/07/0x 周x"为"201007",需要根据本机的日期格式修改
set d=%date:/=%
set d=%d:~0,6%
rem 也可手动s……
[/Quote]
好像这个运行后没效果
samwang1 2011-10-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 forever_young 的回复:]
比如你的test1和test2文件夹在D盘,如果今天运行,就把20110930的文件从test1移动到test2


BatchFile code


@echo off
set sp=D:\test1
set dp=D:\test2

more +14 %~0>%~dp0tmp.vbs
for /f %%a in ('cscript /nologo "%~dp0tmp.vb……
[/Quote]
我运行了一下 文件可以移动 但是会显示找不到and 文件 并且移动后都会删掉那个tmp.vbs文件吗 这样的话每次移动都要重新建立一个新的vbs文件吗?
文编程系统化教程初级1学习编程捷径:(不论是正在学习编程的大学生,还是IT人士或者是编程爱好者,在学习编程的过程用正确的学习方法可以达到事半功倍的效果。对于初学者,可以通过下面的方法学习编程,通过对成百上千个实例练习,则很快会成为编程高手。我们专业从事编程十几年,积累了丰富的编程经验,会陆续制作编程视频供大家学习,级、高级编程我们会专门制作高级的系列编程课程,难度逐步加深,想学编程的可以关注我们的系列课程。可以就相关编程问题提问。1、【编程工具分为 免费自由版、专业版、企业版。】首先通过免费自由版熟悉基本操作,通过我们提供的实例视频学习编程,先快速入门。2、基本入门后,再学习我们提供的级编程课程,通过对若干实例的编程练习,基本可以掌握编程思路。3、想继续加深学习的,可以继续学习高级版编程课程,通过对连接数据库等的学习真正开发出实用的商业管理软件或定制开发程序。4、基本掌握了编程思路之后,再学习其他的编程语言或大学里的编程课程则会非常轻松,因为不论是哪个编程语言,最重要的是学习编程思路,而编程思路基本上是相通的。5、学习完PC电脑端编程后,还可以继续学习APP手机软件开发。APP手机软件开发需要有PC电脑上开发基础,操作基本类似。6、编程工具为 搭建之星,这个编程工具的特点:1、安装简单、迅速,纯文界面,构件丰富,设计过程直观、自由;无需掌握电脑语言,所有编程构件化、命令化、可视化。2、交互式开发,只需要四种类型的“命令”,便可以建立各构件之间的联系;象搭积木一样简单,并可快速的搭建出具有专业水平的软件作品。3、微解释执行,命令解释量小,执行速度快。可以和编译后的可执行文件相媲美。4、提供打包工具,使您即刻将自制软件安装到其它机器上运行。5、自动对开发项目进行加密;使您的项目,在未经授权下,别人无法“浏览、修改”项目的构件关系与搭建方法。课程安排:初级11  初级概述2  熟悉构件取值赋值3 折叠式菜单滑动面板编程4 自定义图形窗口自定义标题栏编程5 多行文本分段显示编程6 调用外部exe文件关闭外部exe文件编程7 给自己编写的项目设置密码8 制作一个计算器编程9 图片浏览编程10 看图软件编程11 配置文件读写编程12密码验证登录编程13软件启动窗口编程14增加软件工具条菜单15调色板编程16随机算式编程17螳螂捕蝉多窗口显示编程18 删除指定的字符行编程19计算表达式编程20扩展系统菜单21时间计算秒级计算编程22数值范围判断编程23数值比较取间值编程24随机抽取编程25锁定窗口编程26文件拷贝显示进度条编程27项目间传递参数公用数据编程28项目间传递参数执行文件编程29字符串截取编程30多媒体实例澳门介绍编程31电影播放软件编程32初级1总结【使用这个编程工具开发的部分实际案例】   

6,850

社区成员

发帖
与我相关
我的任务
社区描述
Windows 2016/2012/2008/2003/2000/NT
社区管理员
  • Windows Server社区
  • qishine
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧