场景举例: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

 

脚本已打包成exe程序,云盘链接如下:

链接:https://pan.baidu.com/s/1v6SLD1hBB9H29CnykXOF5w
提取码:8888