场景举例:A文件夹有500个文件,其中有50个文件文件需要移动到B文件夹,此时用肉眼去找就费时费力;
前提条件:1.你有A文件夹500个文件的文件名,将文件名记录在Excel内,同时能筛选出需要移动的那50个文件的文件名;
实现原理:利用vbs获取到存文件名称的那个Excel表,进入到对应页签,获取需要移动的50个文件名称;
然后把名称输出到bat文档,拼接出一个移动文件的bat脚本,最后再执行生成的bat文件,即可实现文件移动;
bat脚本实际就是copy命令,脚本执行完成之后会对应生成一个log.txt类日志文件,
之所以说是类日志,是因为他只是记录了脚本执行的过程,并不是真正的日志文件,主要作用是用于排查看哪些文件没有移动(复制)成功;
'@author:zks '@edition:V1.2 '@UpdateDate:2021-05-13 '@function:实现从Excel提取文件名并生成copy文件的批处理脚本,实现批量将文件从A文件夹移动到B文件夹的操作; '@从Excel获取需要的数据 Dim oExcel,oWb,oWb1,Osheet,Osheet1,x,y,i,l,title,nuber,filepath,filepath1 Dim count count = 0 Dim a,b,c,d,e,f,g,h,letter,sofilepath,timefilename Dim fso,f1,f2 title = "提取文件指定数据" Set oExcel = CreateObject("Excel.Application") Set fso = CreateObject("Scripting.FileSystemObject") timefilename = Year(Now) & Month(Now) & Day(Now) & Hour(Now) & Minute(Now) & Second(Now)'最终生成的bat文件名称,用时间来命名,以免多次生成导致文件名重复 oWb = InputBox("要提取的目标文件存放路径(精确到XXX文件):",title)'存放文件名的那个Excel文件 Set oWb1 = oExcel.Workbooks.Open(oWb)'打开这个Excel文件 oSheet = InputBox("目标文件的页签名称(如Sheet1,Sheet2):",title)'输入存放50个需要移动文件名的页签 Set oSheet1 = oWb1.Sheets(oSheet)'进入到存放需要移动的50个文件名的页签 '--MsgBox oSheet,vbokonly,title 'Set oWb = oExcel.Workbooks.Open("C:\Users\lenovo\Desktop\计划问题\辅助核算对照信息.xls") 'Set oSheet1 = oWb.Sheets("HSXM") '起始行号指的是,比如存文件名的表叫filename.xlsx, '其中有Sheet1,Sheet2两个页签,Sheet1页签存储500个文件名,Sheet2页签存储的50个需要移动的文件名,同时文件名存储在A列; '第1行是标题,第2行才是文件名,此处的起始行号就填2,取数就会从第二行开始; l = InputBox("取数起始行号(即表格行号,如第一行输入:1):",title) x = InputBox("取数最终行号(即表格行号,例如提取到第10行,输入:10):",title) '最终行号:我们需要提取50个文件名,文件名存放在A列,第1行是标题,所以第50个文件名行号为51,此处就填51; y = InputBox("取数列编码(即表格列编号,如A列,输入:A):",title) '列编码指的就是你要取哪一列的数据,例如我们例子中的A列; letter = InputBox("需要移动的源文件存放盘符(如C盘,输入:C):",title) '指的是那500个文件存放的盘符; filepath = InputBox("需要移动的源文件存放路径(如:C:\Users\lenovo\Desktop,路径最后不能加\):",title) '指的是那500个文件存放的路径; filepath1 = InputBox("移动后新文件存放路径(如:C:\Users\lenovo\Desktop\tset,路径最后不能加\):",title) '50个文件移动后需要存放的路径; sofilepath = InputBox("请输入bat文件存放路径(同上,路径最后不能加\):",title) '生成移动文件的bat脚本文件存放的路径; 'MsgBox sofilepath Set f1 = fso.createtextfile(sofilepath & "\fileprocessing" & timefilename & ".bat",8) '此处是生成一个bat文件,第二个参数 2 表示重写(第二次写出的内容会把第一次的覆盖),如果是 8 表示该文件写入的内容会追加; '以下是利用变量存储bat脚本,然后写出到bat文件中 a = "@echo off" b = letter & ":" c = "echo ---------------------------------" d = "echo 开始移动文件。。。执行完毕前请勿关闭页面!" e = "echo 移动日志将输出到 log.txt" f = "echo ----------------------------------" g = "echo 执行完毕!" h = "pause" '这里开始写入 f1.WriteLine(a) f1.WriteLine(b) f1.WriteLine(c) f1.WriteLine(d) f1.WriteLine(e) f1.WriteLine(f) '这里是利用for循环去遍历Excel表里目标的行和列,获取需要移动的文件名,然后再拼接处一条bat语句用nuber存储并写出到bat文件; For i = l To x nuber = "copy " & filepath & "\" & oSheet1.Range(y & i).value & "* " & filepath1 & " >> " & filepath1 & "\log.txt" 'msgbox nuber f1.WriteLine(nuber) Count = Count + 1 Next 'MsgBox Count 'msgbox osheet.Range(j&i).value f1.WriteLine(g) f1.WriteLine(h) '至此,bat文件写入完成; MsgBox "生成的批处理文件已存放到" & sofilepath & "请查收!" f1.Close() Set f1 = Nothing Set fso = Nothing Set oWb1 = Nothing Set Osheet1 = Nothing oExcel.Quit
Ps:实际上移动文件仅仅只是执行批处理之后实现的,下面放一下批处理源码
@echo off G: echo --------------------------------- echo 开始移动文件。。。执行完毕前请勿关闭页面! echo 移动日志将输出到 log.txt echo ---------------------------------- copy 五华区交维扫描文件\五华区共享联通昆烟停车场-5HHQ* G:\五华区交维扫描文件\2990 >> G:\五华区交维扫描文件\2990\log.txt copy 五华区交维扫描文件\五华区师大商学院-5HHQ* G:\五华区交维扫描文件\2990 >> G:\五华区交维扫描文件\2990\log.txt echo ---------------------------------- echo 执行完毕! pause