DiskCleaner:VBScript 中的无用文件擦除器






3.82/5 (8投票s)
本教程脚本展示了如何在 VBScript 中正确获取路径,并利用它们清除无用文件。
引言
Windows Scripting Host 和 VBScript 提供了多种方法来获取所谓的“特殊文件夹”(Windows、我的文档、应用程序数据、临时目录等)。该脚本展示了所有这些方法,并提供了一个应用程序来清理磁盘,删除我视为无用文件的内容。在运行脚本之前,您应该仔细阅读并理解它将删除什么内容,否则您的磁盘可能会变得和我一样干净,甚至可能对您来说太干净了!
您可以将它视为一个快速清理磁盘的实用工具,或者作为一个教程,让您最终了解如何在不硬编码的情况下获取这些特殊文件夹的名称。
它做什么?
Diskcleaner [/v] [/q] [/r] 删除
- 文件:用户最近使用的文件、系统临时文件夹、用户临时文件夹;Office XP 最近使用的文件、Internet 临时文件。
- 注册表项:媒体播放器最近使用的文件、Explorer 最近使用的文件。
选项如下:
- 无命令行参数:当文件被锁定无法删除时显示一条消息。
- /v: 详细模式,显示每项操作的消息。
- /q: 静默模式,不显示默认消息。覆盖 /v。
- /r: 在更改注册表前请求确认。
如果您不想删除某些内容(例如最近使用的文件),可以在使用脚本前对其进行修改。
代码
首先,声明常用的对象,主要是 Wscript.Shell
和 FileSystemObject
。
' Declare basic objects
dim wshFSO : Set wshFSO = CreateObject("Scripting.FileSystemObject")
dim wshShell : Set wshShell = CreateObject("WScript.Shell")
dim wshSysEnv : Set wshSysEnv = wshShell.Environment
dim wshUsrEnv : Set wshUsrEnv = wshShell.Environment("User")
dim wshPrcEnv : Set wshPrcEnv = wshShell.Environment("Process")
dim wshNet : Set wshNet = WScript.CreateObject("WScript.Network")
dim wshArgs : Set wshArgs = WScript.Arguments
读取参数。例如,查找 /v:如果需要详细模式,blnVerbose
将被设为 true。
dim I
dim blnVerbose : blnVerbose = False
For I = 0 to wshArgs.Count - 1
blnVerbose = blnVerbose Or (wshArgs(I)="/v") Or (wshArgs(I)="/V")
Next
然后,数组 arrFolderList
被填入要删除的文件夹的路径。它们很好地展示了获取路径的不同方法(见下文)。
为了清理文件夹,使用了一个经典的递归过程,逐个删除文件:有些文件可能被锁定并产生错误,这些错误必须被处理。
最后,创建一个包含要进行的注册表更改的临时文件。然后调用 Regedit 来应用这些更改(这比使用 VBScript 的注册表过程更健壮)。
如何定位特殊文件夹
我尝试收集了所有可能的方法。最简单的方法列在前面。
wshShell.SpecialFolders("Name")
使用 WScript.Shell
对象的 SpecialFolders
属性。这将显示“我的文档”的路径。
dim wshShell : Set wshShell = Createobject("WScript.Shell")
Msgbox wshShell.SpecialFolders("MyDocuments")
可用的文件夹是(名称本身就足够了):
- AllUsersDesktop
- AllUsersStartMenu
- AllUsersPrograms
- AllUsersStartup
- 桌面
- Favorites
- 字体
- MyDocuments
- NetHood
- PrintHood
- Programs
- Recent
- SendTo
- StartMenu
- 启动
- 模板
wshFSO.GetSpecialFolder(Value)
FileSystemObject
有一个 GetSpecialFolder
方法,可以返回 Windows 和临时文件夹的路径。这将显示 Windows 文件夹。
dim wshFSO : Set wshFSO = CreateObject("Scripting.FileSystemObject")
Msgbox wshFSO.GetSpecialFolder(0)
可用的值是(声明常量):
Const WindowsFolder = 0
Const SystemFolder = 1
Const TemporaryFolder = 2
环境变量
环境变量由 shell 的 environment 属性返回。变量可以是系统、用户或进程级别的。应为每个级别声明一个数组(第一个是“System”)。
dim wshSysEnv : Set wshSysEnv = wshShell.Environment
dim wshUsrEnv : Set wshUsrEnv = wshShell.Environment("User")
dim wshPrcEnv : Set wshPrcEnv = wshShell.Environment("Process")
这将显示用户临时文件夹。
Msgbox wshUsrEnv("TEMP")
可用值在脚本注释中。实际上,此方法仅对获取系统临时目录(通常是 C:\Windows\Temp)非常有用。它使用系统的 TEMP
变量。它通常会返回“%SystemRoot%\Temp”,因此必须对其进行处理才能获得硬编码的路径。
dim strSysTempFolder : strSysTempFolder = wshSysEnv("TEMP")
' Develop %SystemRoot%
strSysTempFolder = Replace(strSysTempFolder, "%SystemRoot%", _
wshPrcEnv("SYSTEMROOT"), 1, -1, vbTextCompare)
相当复杂,但我不知道有其他方法。
直接使用 Windows 环境变量
在命令提示符下键入“Set”时返回的所有变量并不都在上面的表中可用。要获取所有变量,请使用 ExpandEnvironmentStrings
方法。
WshShell.ExpandEnvironmentStrings("%UserProfile%")
变量名用 %
包围。只有 进程 环境变量可用。
除了由程序作为环境变量输入的特殊用途路径外,此方法几乎无用。
注册表
最后但并非最不重要的一点是,注册表存储了 Explorer 和大多数 Microsoft 应用程序在 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\key
中使用的路径。这将显示 Internet 临时文件文件夹。
Msgbox WshShell.RegRead("HKEY_CURRENT_USER\Software\" & _
"Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Cache")
Windows XP 的完整键列表在脚本注释中。
使用哪种方法
按照此处列出的顺序使用这些解决方案。宁愿使用 SpecialFolder("MyDocuments")
而不是注册表项。内置方法和属性(SpecialFolders
和 GetSpecialFolder
)通常足够强大,但必须使用环境变量来获取 Windows 临时文件夹的路径,并使用注册表来获取 Internet 临时文件。
历史
版本 1.1
特点
- /v 已更改,并添加了 /q 和 /r 以允许用户查看脚本正在执行的操作。
Bug 修复
- 脚本未等待用户确认修改注册表,并在注册表处理前删除了临时文件,因此 /v 模式不允许更改注册表。
版本 1.0
首次发布。