系统:Windows 7
软件:Excel 2010
本豆介绍使用场景or困惑:
- 想自动获取共享空间中一些文件夹的名称?
- 文件夹数目较多,如何快速的获取?
示例
如上图所示,目标在于获取1-1,1-2,...,3-5这些文件夹的名称,这些文件夹都在共享空间中
思考
- 想到的第一个方法是使用VBA的fso
- 尝试了一下,速度慢到爆,想砸机的冲动
- 无奈,工作还得干,咋整?
- 在自己会的语言中,bat以速度快,让我映像深刻,来试试看
- 获取文件夹名称,dir,尝试一下,也搜索了一下,发现可行
- bat水平有限,所以结合了点vbs试了一下
逻辑过程
- 为完成这个工作,使用了5个可执行文件(4bat+1vbs),感受到了高手的鄙视-_-!!
- 目标:将所需文件夹名称全部放置于list.txt的文件中
- 逻辑过程
- 运行第1步:删除当前文件夹中其余txt文件及第4步:生成第2级目录.bat文件
- 运行第2步:生成目标文件夹第一级目录:即示例中的1,2,3,放置于C1.txt文件中
- 运行第3步:生成第4步:生成第2级目录.bat文件
- 运行第4步:每个文件夹下的子文件夹清单
- 运行第5步:合并生成的文件,生成list.txt
- 第4步与第2步本质上是一样的,只是dir执行的文件夹路径不同而已,第3步目标就是要获取第4步的代码
结果
5个可执行文件
Set fso = CreateObject("Scripting.FileSystemObject")
currentAddr = fso.GetFile(Wscript.ScriptFullName).ParentFolder.Path
listAddr = currentAddr & "\C1.txt"
Const ForReading = 1, ForWriting = 2, ForAppending = 8, TristateTrue = -1
Set objTxt = fso.OpenTextFile(listAddr, ForReading, TristateTrue)
batAddr = currentAddr & "\" & "第4步:生成第2级目录.bat"
If fso.FileExists(batAddr) Then '删除原文件
fso.DeleteFile (batAddr)
End If
Do While Not objTxt.AtEndOfStream
rowContent = objTxt.ReadLine
If Not InStr(rowContent, ".") <> 0 Then
'新建bat文件
If fso.FileExists(batAddr) Then
Set objBat = fso.OpenTextFile(batAddr, ForAppending, TristateTrue)
Else
Set objBat = fso.CreateTextFile(batAddr, True)
End If
'批处理模板
'set a=2017-06
'cd /d Z:\%a%
'dir /b >%~dp0%a%.txt
'
pathLine = "set Z=F:\【10】微信公众号\2-VBA\【3】文章\20171109-文件获取\示例\test"
objBat.WriteLine (pathLine)
firstLine = "set a=" & rowContent
objBat.WriteLine (firstLine)
secondLine = "cd /d %Z%\%a%"
objBat.WriteLine (secondLine)
thirdLine = "dir /b >%~dp0%a%.txt"
objBat.WriteLine (thirdLine)
fourthLine = ""
objBat.WriteLine (fourthLine)
objBat.Close
End If
Loop
objTxt.Close
代码截图
注意
- 当你把文中代码涉及到的路径直接改为网络空间的地址,运行会失败
-
dir
直接对网络地址无效 - 需要在我的电脑中将网络地址映射到本地
- 如下图,映射地址为Z:
本地地址与网络地址区别
- 对第2步和第3步都有影响,下面展示一下第2步两者的区别
- 其实也没啥本质区别,只是改变一下变量Z对应的地址即可,尴尬
将网络地址映射到本地
若目标文件夹为本地地址
动态过程
以上为本次的学习内容,下回见
如发现有错误,欢迎留言指出
更多精彩,请关注微信公众号
扫描二维码,关注本公众号