自动文件分类vbs脚本
一、demo功能介绍
在生活中或者工作之中,我们经常会遇到的一件事情就是查文件,或者说根据给定的文件,例如.txt文档、excel表格等文档,来进行分类,如果只是少量的工作量,那么手动给它分分类,手动找找,手动copy一下都是无所谓的。但是如果文件达到上百上千了呢,你是否还是愿意自己手动来进行这些操作呢,恐怕就费力不讨好了吧~~~
如果你有过C/C++语言或者其他语言编程基础的话,相信你可以轻松的看懂本文,如果你还只是个小白的话,只要花点心思,相信你也可以学会的。以下就是我在生活中遇到的实际例子,需要根据给定的excel表格完成相应的操作,使用vbs脚本可以在windows系统上轻松的完成以上操作要求,读者可以根据所给的本文所给的Demo,触类旁通,举一反三,也写出属于自己的工作小工具吧,废话不多说,接下来就要详细介绍本文的Demo了。
要求: 根据excel表格中的内容,实现自动分类指定文件夹内的文件
输入: excel表格 、待分类文件
输出: 分类好文件的文件夹
例如:
(1)输入excel表格
test.xls
表格内容为:
(2)输入文件(此外示例为txt格式文件,实际上其他格式的文件均可)
(3)输出文件
二、vbs脚本基本语法介绍
(1)子函数创建
sub Name()//无返回值类型
...
end sub
function name()//返回值函数,返回值即为句柄:name
...
end function
以上两种类型的函数皆可以传参,即Name(n)
(2)常见运算符
1、算术运算符
+ 加
- 减
* 乘
/ 除
\ 整除
mod 取余
^ 幂
& 字符串连接符
2、比较运算符
> 大于
< 小于
= 等于
<> 不等于
>= 大于等于
<= 小于等于
3、逻辑运算符
not 非
and 与
or 或
xor 异或
eqv 等价
imp 隐含
(3)控制结构
1、条件语句
if(xxx)then //then必须与条件判断在同一行
...
end if
if(xxx)then
...
else
...
end if
2、循环语句
Do Until XXX
...
Loop
For i=1 To n step 1//从i到n,步长为1
...
Next
以上为最基本常见的语句,如有兴趣进一步了解,可以参考以下博文:VBS基本语法
三、Demo介绍
(1)子函数----getRow()
功能:获取excel表格中的有效数据行数
Function getRow()
rowCount =objWorkbook.ActiveSheet.UsedRange.Rows.Count
Dim Count:Count = 1
getRow = 0
Do Until Count > rowCount
stringFlag = Left( objExcel.Cells(Count,2),10 )
if( isDate( stringFlag )=True )then
if(flagStart = 1)then
flagStart = Count
end if
getRow = getRow + 1
end if
Count = Count +1
Loop
End Function
实现思路:
利用Left( Left( objExcel.Cells(Count,2),10 ) )函数
使用objExcel.Cells(Count,2)取出excel表格中第Count行,第2列中的字符串 (这里只取第2列中的数据,是因为表格内容排版格式原因,读者因根据具体情况具体分析)
再将取得的字符串从左开始,取10个字符长度的内容
遍历整个表格,当读取到的文本为 “日期” 类型的数据时,即判断为一行有效数据,并将最终的行数返回:
getRow = getRow + 1
注意:excel表格最左上角是:第1行,第一列,excel表中的汉字也为一个字符大小
(2)子函数----getFileNum(text)
功能:获取所需分类的文件内容
Function getFileNum(text)
Dim result(3),Count:Count = 1
num1 = 0
num2 = 0
num3 = 0
textLen = len(text)
Do Until Count > textLen
if( isNumeric( mid(text,Count,1) ) = False )then
num1 = num1 + 1
else
exit Do
end if
Count = Count +1
Loop
result(0) = mid(text,1,num1)
Do Until Count > textLen
if( isNumeric( mid(text,Count,1) ) = True)then
num2 = num2 + 1
else
exit Do
end if
Count = Count +1
Loop
result(1) = mid(text,num1+1,num2)
Do Until Count > textLen
if( isNumeric( mid(text,Count+1,1) ) = True)then
num3 = num3 + 1
else
exit Do
end if
Count = Count +1
Loop
result(2) = mid(text,num1+num2+2,num3)
getFileNum = result
End Function
实现思路:
表中的 “周易1-2卦” 代表包括文件周易中的第一卦文件、第二卦文件 (符号“-”的意思表示:XXX至XXX)
首先定义一个三维数据:
Dim result(3)
接着将excel表中的 “周易1-2卦” 分解为:“周易”、“1”、“2”,并且分别存储于result(0)、result(1)、result(2)中,最后利用下句将数组result返回
getFileNum = result
其中:
isNumeric() 判断是否为数值内容,是则返回True,否则返回False
mid(text,m,n) 取出字符串text中第m到第n个字符之间的内容
(3)子函数----createFolder()
功能:创建文件夹并实现分类
Sub createFolder()
set fso = Wscript.CreateObject("Scripting.FileSystemObject")
if(not fso.FolderExists(currentpath & name)) then
fso.CreateFolder(currentpath & name)
realRow = getRow()
flagEnd = realRow + flagStart - 1
Dim Count1:Count1 = 0
Dim Count2:Count2 = 3
rem Dim saveStart,saveEnd
Do Until Count1 >= realRow
Count1 = Count1 +1
targetPath = currentpath & name & "/" & "第" & Count1 & "周"
fso.CreateFolder(targetPath)
realCols = 5//此处设置扫描列数为5列,实际上读者可以修改为:根据excel表格某行的列数动态变化
Count2 = 3
Do Until Count2 > realCols
if(objExcel.Cells(Count1 + flagStart - 1,Count2)="")then
exit Do
end if
data= getFileNum( objExcel.Cells(Count1 + flagStart - 1,Count2) )
if(data(2)="")then
saveStart = data(1)
saveEnd = data(1)
else
saveStart = data(1)
saveEnd = data(2)
end if
For i = saveStart To saveEnd step 1
sourceFile = currentpath & "file\" & data(0) & "\check" & i & ".txt"
fso.getfile(sourceFile).copy(targetPath & "\" & data(0) & i & ".txt")
Next
Count2 = Count2 + 1
Loop
Loop
end if
End Sub
实现思路:
利用 targetPath = currentpath & name & “/” & “第” & Count1 & “周” 语句生成目标文件夹的目录,并根据此目录创建相应的文件夹: fso.CreateFolder(targetPath)
当创建好相应的文件夹之后,接着根据 getFileNum(text) 函数读取的内容进行文件复制,并同步将文件重命名,此处命名为: data(0) & i & ".txt(eg.周易1.txt)
sourceFile = currentpath & "file\" & data(0) & "\check" & i & ".txt"
fso.getfile(sourceFile).copy(targetPath & "\" & data(0) & i & ".txt")
(4)主函数
功能:打开指定的excel表格,并进行创建文件夹和分类,完成后显示:Success!!!
name = InputBox("请输入生成文件夹名称!")
excel = InputBox("请输入xls表格名称!")
flagStart = 1
flagEnd = 0
currentpath = createobject("Scripting.FileSystemObject").GetFolder(".").Path
currentpath = currentpath & "\"
Set objExcel = CreateObject("Excel.Application")
Set objWorkbook = objExcel.Workbooks.Open (currentpath & excel & ".xls" )
rem Set objWorkbook = objExcel.Workbooks.Open (currentpath & "test.xls" )
createFolder()
objExcel.Workbooks(1).Close(true) '关闭工作表
objExcel.Quit ' 退出
msgbox "Success!!!"
四、运行效果
附录(完整代码)
/*在windows系统下创建.txt文件后,将代码复制到文本中,修改文档为.vbs文件,双击即可运行
author:Mr.silver
date:2019/8/31 */
name = InputBox("请输入生成文件夹名称!")
excel = InputBox("请输入xls表格名称!")
flagStart = 1
flagEnd = 0
currentpath = createobject("Scripting.FileSystemObject").GetFolder(".").Path
currentpath = currentpath & "\"
Set objExcel = CreateObject("Excel.Application")
Set objWorkbook = objExcel.Workbooks.Open (currentpath & excel & ".xls" )
rem Set objWorkbook = objExcel.Workbooks.Open (currentpath & "test.xls" )
createFolder()
objExcel.Workbooks(1).Close(true) '关闭工作表
objExcel.Quit ' 退出
msgbox "Success!!!"
Sub createFolder()
set fso = Wscript.CreateObject("Scripting.FileSystemObject")
if(not fso.FolderExists(currentpath & name)) then
fso.CreateFolder(currentpath & name)
realRow = getRow()
flagEnd = realRow + flagStart - 1
Dim Count1:Count1 = 0
Dim Count2:Count2 = 3
rem Dim saveStart,saveEnd
Do Until Count1 >= realRow
Count1 = Count1 +1
targetPath = currentpath & name & "/" & "第" & Count1 & "周"
fso.CreateFolder(targetPath)
realCols = 5
Count2 = 3
Do Until Count2 > realCols
if(objExcel.Cells(Count1 + flagStart - 1,Count2)="")then
exit Do
end if
data= getFileNum( objExcel.Cells(Count1 + flagStart - 1,Count2) )
if(data(2)="")then
saveStart = data(1)
saveEnd = data(1)
else
saveStart = data(1)
saveEnd = data(2)
end if
For i = saveStart To saveEnd step 1
sourceFile = currentpath & "file\" & data(0) & "\check" & i & ".txt"
fso.getfile(sourceFile).copy(targetPath & "\" & data(0) & i & ".txt")
Next
Count2 = Count2 + 1
Loop
Loop
end if
End Sub
Function getRow()
rowCount =objWorkbook.ActiveSheet.UsedRange.Rows.Count
Dim Count:Count = 1
getRow = 0
Do Until Count > rowCount
stringFlag = Left( objExcel.Cells(Count,2),10 )
if( isDate( stringFlag )=True )then
if(flagStart = 1)then
flagStart = Count
end if
getRow = getRow + 1
end if
Count = Count +1
Loop
End Function
Function getFileNum(text)
Dim result(3),Count:Count = 1
num1 = 0
num2 = 0
num3 = 0
textLen = len(text)
Do Until Count > textLen
if( isNumeric( mid(text,Count,1) ) = False )then
num1 = num1 + 1
else
exit Do
end if
Count = Count +1
Loop
result(0) = mid(text,1,num1)
Do Until Count > textLen
if( isNumeric( mid(text,Count,1) ) = True)then
num2 = num2 + 1
else
exit Do
end if
Count = Count +1
Loop
result(1) = mid(text,num1+1,num2)
Do Until Count > textLen
if( isNumeric( mid(text,Count+1,1) ) = True)then
num3 = num3 + 1
else
exit Do
end if
Count = Count +1
Loop
result(2) = mid(text,num1+num2+2,num3)
getFileNum = result
End Function