在日常使用计算机过程中,会产生大量的空文件和空文件夹,利用脚本就可以打他们找出来并删除。
脚本中利用了递归,效率会受到影响。
目前没有完成:1. 输入的盘符没有进行校验,所以输入时需要注意格式。
2.程序默认是直接删除文件和文件夹,没有发送到回收站。(后期的修改中添加此功能)
代码如下:
'
'功能:删除本地磁盘中空文件夹和空文件的VBS脚本。
'并创建删除日志EmptyDeleteLog.log文件,保存在C盘的根目录下。
'作者: Zero
'创建时间: 2014/11/6
'更新时间: 2015/12/8
'版本:0.01 beta
'///
'Golbal Variables
Dim WshShell, objFSO, logFile, logBook
Const ForAppending = 8
logFile = "C:\EmptyDeleteLog.log" '日志保存路径
Set WshShell = WScript.CreateObject("Wscript.Shell") 'Shell对象
Set objfso = WScript.CreateObject("Scripting.FileSystemObject") 'FileSystemObject对象
Set logBook = objFSO.OpenTextFile(logFile, ForAppending, True) '以追加方式打来日志文件,True表示当文件不存在时,创建新文件。
Call MainSub() '调用主过程
'/
'功能:主过程,调用各个子过程和函数。
'参数:无
'创建时间: 2014/11/6
'更新时间: 2015/12/8
'
Sub MainSub()
On Error Resume Next
prompt = "日志文档保存在 " & vbCrLf & logFile & vbCrLf & vbCrLf & "单击是(开始),否(退出)!" & vbCrLf & vbCrLf &_
"(c) Zero 2015"
confirm = MsgBox("本脚本将在本地磁盘上搜索空的东西(文件夹和文件)!" & vbCr & prompt, vbYesNo +vbInformation + vbdefaultbutton1, "欢迎使用!By Zero")
If confirm = vbYes Then
MsgBox "不建议在C盘和D盘使用,错误删除与作者无关" , vbOKOnly + vbExclamation ,"提示"
MainProcess()
Else If confirm = vbNo Then
MsgBox "你选择了退出" & vbCrLf & "(c) Zero 2015" , vbOKOnly+ vbError,"提示"
WScript.Quit
End If
End If
End Sub
'
'功能:分析和处理用户输入的选项,选项1代表搜索文件,选项2代表搜索文件夹,选项3代表退出
'参数:无
'创建时间: 2014/11/6
'更新时间: 2015/12/8
'///
Function MainProcess()
On Error Resume Next
Dim strChoices, nResult, getDrv, Ext, logBook, extName
strChoices = "1.删除空的文档" & vbCr & "2.删除空的文件夹" & vbCr & "3.退出"
Do
nResult = InputBox("请输入需要处理的事项:" & vbCr & strChoices, "选项")
if IsNumeric(nResult) then
Exit Do
Else
MsgBox "请输入1到3之间的整数", vbYes + vbError, "输入错误"
end If
Loop
Select Case CInt(nResult)
Case 1: '搜索空文件
ProcessEmptyFile()
Case 2: '搜索空文件夹
ProcessEmptyFolder()
Case 3: '退出
WScript.Quit
Case Else: '显示错误信息
MsgBox "请输入1到3之间的整数", vbYes + vbError, "输入错误"
End Select
End Function
'
'功能:处理空文件,并检查盘符是否存在。检查结束后,打开日志文件
'参数:无
'创建时间: 2014/11/6
'更新时间: 2015/12/8
'///
Sub ProcessEmptyFile()
Do
getDrv = InputBox("请输入需要处理的盘符"& "格式如下:E","盘符","E")
getDrv = getDrv & ":\" '格式盘符
If objFSO.DriveExists(getDrv) Then
Exit Do
Else
MsgBox "你输入的盘符不存在", vbOKOnly + vbExclamation, "错误"
End If
Loop
extName = InputBox("请输入需要搜索的文件扩展名"& "比如:txt","扩展名","txt")
WshShell.Popup "现在开始检查文件", 2
Call CheckDiskFile(getDrv,extName) '调用CheckDiskFile函数遍历和检查文件
OpenLogFile() '结束后,打开日志文件
WScript.Quit '退出
End Sub
Sub ProcessEmptyFolder()
Do
getDrv = InputBox("请输入需要处理的盘符"& "格式如下:E","盘符","E")
getDrv = getDrv & ":\"
If objFSO.DriveExists(getDrv) Then
Exit Do
Else
MsgBox "你输入的盘符不存在", vbOKOnly + vbExclamation, "错误"
End If
Loop
Set drive = objfso.GetDrive(getDrv)
WshShell.Popup "现在开始检查文件夹", 2
CheckFolder(drive.RootFolder)
OpenLogFile()
End Sub
'
'功能:检查文件是否为空
'参数:无
'创建时间: 2014/11/6
'更新时间: 2015/12/8
'///
Sub IsEmptyFile(file,ext)
On Error Resume Next
extName = objFSO.GetExtensionName(file) '得到文件的扩展名
fileContent = objFSO.GetFile().OpenAsTextStream().ReadAll() '得到文件的内容
'如果文件的大小为零或文件的内容为空就删除文件
If (file.Size = 0 And extName = ext) Or (extName = ext And fileContent = "") Then
ReportEmptyFile(file)
End If
End Sub
'
'功能:删除文件,并将空文件的删除信息写入日志文件
'参数:无
'创建时间: 2014/11/6
'更新时间: 2015/12/8
'///
Function ReportEmptyFile(file)
On Error Resume Next
response = MsgBox("我们在" & vbCr & file.Path & "发现了空文件," &_
"你想删除吗?", vbYesNoCancel + vbDefaultButton1,"提示")
If vbYes = response Then
logBook.WriteLine
logBook.WriteLine "[文件:]"
logBook.WriteLine "文件名称:" & file.Name
logBook.WriteLine "文件路径: " & file.Path
logBook.WriteLine "文件创建时间: " & file.DateCreated
logBook.WriteLine "文件最后修改时间: " & file.DateLastModified
logBook.WriteLine "-----------------------------------------------"
logBook.WriteLine "在 " & Now & " 被删除"
logBook.Close()
objFSO.DeleteFile file, True '删除文件
Else If vbCancel = response Then '单击取消就打开日志文件
OpenLogFile()
End If
End If
End Function
'/// /检查空文件部分结束
'
'功能:遍历并检查文件夹下的子文件夹是否为空(其中用到了递归)
'参数:objFolder
'创建时间: 2014/11/6
'更新时间: 2015/12/8
'///
Function CheckFolder(objFolder)
On Error Resume Next
IsEmptyFolder(objFolder)
for each subfolder in objFolder.subfolders
CheckFolder subfolder '递归检查子文件夹
Next
End Function
Function IsEmptyFolder(objFolder)
On Error Resume Next
if objFolder.Size=0 and err.Number=0 Then '文件夹的大小为零
if objFolder.subfolders.Count=0 Then '文件夹下没有子文件夹
ReportEmptyFolder objFolder
End If
End If
End Function
'
'功能:删除文件夹,将空文件夹的删除信息写入日志文件
'参数:无
'创建时间: 2014/11/6
'更新时间: 2015/12/8
'///
Sub ReportEmptyFolder(objFolder)
On Error Resume Next
response = MsgBox("我们在:" & vbCr _
& objFolder.path & vbCr & "发现了空文件夹 " _
& "你想删除这个文件夹么?", _
vbYesNoCancel + vbDefaultButton2)
If response = vbYes Then
logBook.WriteLine
logBook.WriteLine "[文件夹:]"
logBook.WriteLine "文件夹名称:" & objFolder.Name
logBook.WriteLine "文件夹路径: " & objFolder.Path
logBook.WriteLine "文件夹创建时间: " & objFolder.DateCreated
logBook.WriteLine "文件夹最后修改时间: " & objFolder.DateLastModified
logBook.WriteLine "-----------------------------------------------"
logBook.WriteLine "在 " & Now & " 被删除"
logBook.Close()
objFSO.DeleteFolder objFolder, True '删除文件夹
Else If response= vbCancel Then
OpenLogFile()
End If
End If
end Sub
'/
'功能:遍历特定磁盘的包含ext扩展名的文件和文件夹(利用递归)
'作者: Zero
'创建时间: 2014/11/6
'更新时间: 2015/12/8
'
Function CheckDiskFile(drv,ext)
On Error Resume Next
Dim colFiles, File, extTemp, subFolderTemp, colSubFolders
extTemp = ext
Set drvRootFiles = objFSO.GetFolder(drv)
Set colFiles = drvRootFiles.Files
For Each File In colFiles
IsEmptyFile File,extTemp
Next
Set subFolderTemp = fso.GetFolder(drv)
Set colSubFolders = subFolderTemp.SubFolders
For Each subfolder In colSubFolders
CheckDiskFile subfolder,extTemp '递归
Next
End Function
'/
'功能: 打开日志文件
'参数:无
'创建时间: 2014/11/6
'更新时间: 2015/12/8
'
Function OpenLogFile()
MsgBox "谢谢使用!现在打开日志文件!" & vbCrLf & "(c) Zero 2015"
WshShell.Run logFile
End Function
程序界面: