系統:Windows 7
軟件:Excel 2010
本豆介紹使用場景or困惑:
- 想自動獲取共享空間中一些文件夾的名稱?
- 文件夾數目較多,如何快速的獲???
示例
1.png
如上圖所示,目標在于獲取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步的代碼
結果
3.png
5個可執行文件
4..png
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
代碼截圖
5.png
注意
- 當你把文中代碼涉及到的路徑直接改為網絡空間的地址,運行會失敗
-
dir
直接對網絡地址無效 - 需要在我的電腦中將網絡地址映射到本地
- 如下圖,映射地址為Z:
7.png
6.png
本地地址與網絡地址區別
- 對第2步和第3步都有影響,下面展示一下第2步兩者的區別
- 其實也沒啥本質區別,只是改變一下變量Z對應的地址即可,尷尬
將網絡地址映射到本地
8.png
若目標文件夾為本地地址
9.png
動態過程
1.gif
以上為本次的學習內容,下回見
如發現有錯誤,歡迎留言指出
更多精彩,請關注微信公眾號
掃描二維碼,關注本公眾號
公眾號底部二維碼.jpg