65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.82/5 (8投票s)

2004 年 6 月 14 日

CPOL

4分钟阅读

viewsIcon

81229

downloadIcon

1004

本教程脚本展示了如何在 VBScript 中正确获取路径,并利用它们清除无用文件。

引言

Windows Scripting Host 和 VBScript 提供了多种方法来获取所谓的“特殊文件夹”(Windows、我的文档、应用程序数据、临时目录等)。该脚本展示了所有这些方法,并提供了一个应用程序来清理磁盘,删除我视为无用文件的内容。在运行脚本之前,您应该仔细阅读并理解它将删除什么内容,否则您的磁盘可能会变得和我一样干净,甚至可能对您来说太干净了!

您可以将它视为一个快速清理磁盘的实用工具,或者作为一个教程,让您最终了解如何在不硬编码的情况下获取这些特殊文件夹的名称。

它做什么?

Diskcleaner [/v] [/q] [/r] 删除

  • 文件:用户最近使用的文件、系统临时文件夹、用户临时文件夹;Office XP 最近使用的文件、Internet 临时文件。
  • 注册表项:媒体播放器最近使用的文件、Explorer 最近使用的文件。

选项如下:

  • 无命令行参数:当文件被锁定无法删除时显示一条消息。
  • /v: 详细模式,显示每项操作的消息。
  • /q: 静默模式,不显示默认消息。覆盖 /v。
  • /r: 在更改注册表前请求确认。

如果您不想删除某些内容(例如最近使用的文件),可以在使用脚本前对其进行修改。

代码

首先,声明常用的对象,主要是 Wscript.ShellFileSystemObject

' 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") 而不是注册表项。内置方法和属性(SpecialFoldersGetSpecialFolder)通常足够强大,但必须使用环境变量来获取 Windows 临时文件夹的路径,并使用注册表来获取 Internet 临时文件。

历史

版本 1.1

特点

  • /v 已更改,并添加了 /q 和 /r 以允许用户查看脚本正在执行的操作。

Bug 修复

  • 脚本未等待用户确认修改注册表,并在注册表处理前删除了临时文件,因此 /v 模式不允许更改注册表。

版本 1.0

首次发布。

© . All rights reserved.