【问题标题】:Change a script to check remaining space of a drive更改脚本以检查驱动器的剩余空间
【发布时间】:2016-04-02 13:30:57
【问题描述】:

我目前有这个 VBScript,它检查文件夹的大小,然后删除文件(最旧的在前)直到达到阈值。

Option Explicit
'use next line for production
On Error Resume Next 
'use next line for debugging
'On Error GoTo 0

Dim strResult: strResult = Wscript.ScriptName
Dim objFSO, strOldestFile, dtmOldestDate, strFolder, oFolder, intFolderSize

Set objFSO = CreateObject("Scripting.FileSystemObject")
dtmOldestDate = Now
strFolder     = "C:\Users\PLEX\Downloads\Torrent\"
strOldestFile = "" 
Set oFolder   = objFSO.GetFolder(strFolder)

intFolderSize = Int(((oFolder.Size / 1024) / 1024) / 1024)

Do While intFolderSize >= 110
  strOldestFile = ""
  dtmOldestDate = Now

  FindOldestFile oFolder

  'WScript.Echo strOldestFile
  objFSO.DeleteFile strOldestFile, True
  strResult = strResult & vbNewLine & dtmOldestDate & vbTab & strOldestFile

  intFolderSize = Int(((oFolder.Size / 1024) / 1024) / 1024)
Loop

'WScript.Echo strResult
WScript.Quit

Sub FindOldestFile(objFolder)
  Dim objFile, colFiles, colFolders, strFile, dtmFileDate
  'find oldest file
  Set colFiles = objFolder.Files
  For Each objFile In colFiles
    strFile = objFile.Path
    dtmFileDate = objFile.DateCreated
    If dtmFileDate < dtmOldestDate Then
      dtmOldestDate = dtmFileDate
      strOldestFile = strFile
    End If
  Next
  'recurse subfolders
  Set colFolders = objFolder.SubFolders
  For Each objFile In colFolders
    FindOldestFile objFile
  Next
End Sub

目前此脚本将:

  1. 检查文件夹 A 的容量,包括所有子文件夹。
  2. 从文件夹 A 和子文件夹中删除文件(最旧的在前),直到达到阈值(在本例中为 110GB)

我想修改脚本来做到这一点:

  1. 检查文件夹 A 的容量,包括所有子文件夹。
  2. 从文件夹 B(它是文件夹 A 的子文件夹)和子文件夹中删除文件(最旧的在前),直到达到阈值。

例如,当 C: 上剩余少于 5% 时,是否可以让此脚本检查整个 C: 驱动器的已用容量并从 C:\Users\PLEX\Downloads\Torrent\ 删除最旧的文件?


编辑:我已经拥有完全访问权限,并通过将 C:\ 更改为 C: 来修复错误。我还将C:\Users\PLEX\Desktop\New Folder 更改为\Users\PLEX\Desktop\New Folder,现在没有任何错误。唯一的问题是IntFolderSize 仍然显示我的子文件夹的大小,而不是根目录。我已经通过使用Wscript.Echo intfoldersize 确认了这一点。我当前的脚本如下。如何让IntFolderSize 显示根的使用大小?

option explicit
'use next line for production
'On Error Resume Next 
'use next line for debugging
'On Error GoTo 0

Dim strResult: strResult = Wscript.ScriptName
Dim objFSO, strOldestFile, dtmOldestDate, strFolder, oFolder, intFolderSize
Set objFSO = CreateObject("Scripting.FileSystemObject")
    dtmOldestDate = Now
    strFolder = "C:"
    strOldestFile = "" 
Set oFolder = objFSO.GetFolder( strFolder)

intFolderSize = Int(((oFolder.Size / 1024) / 1024) / 1024)

Wscript.Echo intfoldersize

Do While intFolderSize >= 70
  strOldestFile = ""
  dtmOldestDate = Now

FindOldestFile objFSO.GetFolder(objFSO.BuildPath(strFolder,"\Users\PLEX\Desktop\New Folder\"))

'wscript.echo strOldestFile
  objFSO.DeleteFile strOldestFile, True
  strResult = strResult & vbNewLine & dtmOldestDate & vbTab & strOldestFile 

  intFolderSize = Int(((oFolder.Size / 1024) / 1024) / 1024)

Loop

'Wscript.Echo strResult
Wscript.Quit

Sub FindOldestFile( objFolder)
  Dim objFile, colFiles, colFolders, strFile, dtmFileDate
  ' find oldest file
  Set colFiles = objFolder.Files
  For Each objFile in colFiles
    strFile = objFile.Path
    dtmFileDate = objFile.DateCreated
    If dtmFileDate < dtmOldestDate Then
      dtmOldestDate = dtmFileDate
      strOldestFile = strFile
    End If
  Next
  ' recurse subfolders
  Set colFolders = objFolder.SubFolders
  For Each objFile in colFolders
    FindOldestFile objFile
  Next
End Sub

【问题讨论】:

    标签: vbscript


    【解决方案1】:

    改变

    FindOldestFile oFolder
    

    进入

    FindOldestFile objFSO.GetFolder(objFSO.BuildPath(strFolder, "sub\folder"))
    

    其中strFolder 是您的根文件夹,"sub\folder" 是该根文件夹下的子文件夹的相对路径。


    编辑:请注意,oFolder.Size 属性将引发错误,除非您有权访问 oFolder 下的每个文件和文件夹。如果您仍然想检查卷上的可用磁盘空间,您最好使用 WMI 并严格使用 oFolder 来删除要从中删除的文件夹:

    strFolder   = "C:\Users\PLEX\Desktop\New folder"
    Set oFolder = objFSO.GetFolder(strFolder)
    
    threshold = ...    'desired minimum free diskspace in byte
    
    Set wmi = GetObject("winmgmts://./root/cimv2")
    qry = "SELECT * FROM Win32_Volume WHERE DriveLetter='C:'"
    
    Do While wmi.ExecQuery(qry).ItemIndex(0).FreeSpace < threshold
      ...
      FindOldestFile oFolder
      ...
    Loop
    

    【讨论】:

    • This is what my script looks like now. 我在第 16 行 intFolderSize = Int(((oFolder.Size / 1024) / 1024) / 1024) 上收到拒绝访问错误。知道如何解决这个问题吗?
    • "sub\folder" 必须相对于根文件夹,而不是绝对路径,并且您必须对根文件夹下的所有内容具有完全访问权限,.Size 才能正常工作。
    • 我已经拥有完全访问权限,并通过将 C:\ 更改为 C: 来修复错误。我还将C:\Users\PLEX\Desktop\New Folder 更改为\Users\PLEX\Desktop\New Folder,现在没有任何错误。唯一的问题是IntFolderSize 仍然显示我的子文件夹的大小,而不是根目录。我已经通过使用Wscript.Echo intfoldersize 确认了这一点。 My current script can be found here. 如何让IntFolderSize 显示根的使用大小?
    • @Cameron .GetFolder("C:") 冒号后没有尾随反斜杠为您提供给定驱动器上的当前目录,该目录不一定是根文件夹(请与WScript.Echo oFolder.Path 核对)。在任何现代 Windows 系统上,您都无法完全访问 C: 上的所有内容,即使是管理员也不行,因此 .GetFolder("C:\").Size 应该会引发错误。使用我的回答中概述的方法。
    猜你喜欢
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 2011-04-08
    • 2019-05-11
    • 1970-01-01
    • 2022-07-21
    • 2013-09-17
    • 2011-05-27
    相关资源
    最近更新 更多