Scripting

VBscript 獲取使用者的文件和桌面文件夾大小

  • June 30, 2012

我一直在網上搜尋一個體面的腳本,以允許我收集 Windows 7 機器上子文件夾的文件夾大小。我想在 C:\Users\username\Documents 和 C:\Users\username\Desktop 上獲取大約 50 台電腦的文件夾大小)。

我沒有編寫腳本的經驗(將因此開始學習)並且沒有足夠的知識來編輯其他人的腳本。

我一直在處理的腳本如下。如果有人能指出我正確的方向,我將不勝感激。

' Name : localprofiles.vbs
' Description : script to enumerate the local profile size of all computers and users in Active Directory
' Author : dirk adamsky - deludi bv
' Version : 1.00
' Date : 28-06-2011

Set adoCommand = CreateObject("ADODB.Command")
Set adoConnection = CreateObject("ADODB.Connection")
adoConnection.Provider = "ADsDSOObject"
adoConnection.Open "Active Directory Provider"
adoCommand.ActiveConnection = adoConnection
Set objRootDSE = GetObject("LDAP://RootDSE")
strBase = "<LDAP://" & objRootDSE.Get("defaultNamingContext") & ">"
strFilter = "(&(objectCategory=computer)(|(operatingSystem=Windows XP Professional)(operatingSystem=Windows 7*)))"
strAttributes = "name, operatingSystem"
strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";subtree"
adoCommand.CommandText = strQuery
adoCommand.Properties("Page Size") = 100
adoCommand.Properties("Timeout") = 30
adoCommand.Properties("Cache Results") = False

Set adoRecordset = adoCommand.Execute

Do Until adoRecordset.EOF
   strHostname = adoRecordset.Fields("name").Value
   If CheckStatus(strHostname) = True Then
       If Instr(adoRecordset.Fields("operatingSystem").Value, "XP") > 0 Then
           strLocalProfilePath = "\Documents and Settings\"
       ElseIf Instr(adoRecordset.Fields("operatingSystem").Value, "7") > 0 Then
           strLocalProfilePath = "\users\"
       End If
       GetLocalProfileSize strHostname, "\\" & strHostname & "\c$" & strLocalProfilePath
   End If
   adoRecordset.MoveNext
Loop

adoRecordset.Close
adoConnection.Close

Set adoRecordset = Nothing
Set objRootDSE = Nothing
Set adoConnection = Nothing
Set adoCommand = Nothing

Function CheckStatus(strAddress)
   Dim objPing, objRetStatus
   Set objPing = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery _
     ("select * from Win32_PingStatus where address = '" & strAddress & "'")
   For Each objRetStatus In objPing
       If IsNull(objRetStatus.StatusCode) Or objRetStatus.StatusCode <> 0 Then
           CheckStatus = False
       Else
           CheckStatus = True
       End If
   Next
   Set objPing = Nothing
End Function

Function GetLocalProfileSize(strTargetMachine, strFolder)
   Set objFSO = CreateObject("Scripting.FileSystemObject")
   Set objFolder = objFSO.GetFolder(strFolder)
   For Each SubFolder in objFolder.SubFolders
       Logprint strTargetMachine & " ; " & SubFolder.Name & " ; " & SubFolder.Path & " ; " & Round(SubFolder.Size/1048576,2) & " MB"
   Next
   Set objFolder = Nothing
   Set objFSO = Nothing
End Function

Function LogPrint(Message)
Const ForAppending = 8
strDate = Replace(Date,"/","-")
Set ObjFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = ObjFSO.OpenTextFile("c:\temp" & strDate & "-localprofiles.csv", ForAppending, True)
   objTextFile.WriteLine Message
   objTextFile.Close
Set objTextFile = Nothing
Set ObjFSO = Nothing
End Function

我知道這不會回答您對 vbscript 的問題,但如果您願意,我會推薦 powershell。它通常更容易,只是給你一個例子……

這是一個開始的連結:http ://technet.microsoft.com/en-us/library/ff730945.aspx

這是他們範例的修改版本:

$colItems = (Get-ChildItem C:\users\username\desktop -recurse | Measure-Object -property length -sum)
"{0:N2}" -f ($colItems.sum / 1MB) + " MB"

更改值C:\users\username\desktop並告訴我您是否喜歡結果。如果您需要幫助並從遠端電腦循環和獲取數據,請告訴我。

腳本 v1:它並不完美,但我認為它會在大多數情況下工作。您需要下載 Quest AD CMDlets 並將其安裝在您要執行它的系統上。此外,您需要將執行策略設置為遠端簽名。然後將此腳本複製到該系統的本地驅動器。您需要編輯三個值,$rootou(這是您要搜尋的 OU)和 #Export 路徑下的兩行。讓我知道它是如何工作的。或者如果您需要上傳腳本的副本。

#Script used to gather data size of remote computers user profiles by Eric C. Singer

#a generic powershell object used to group a collection of various objects into a single object 
$data = new-object psobject
$columns = @"
ComputerName
ProfileName
DocumentsSizeMB
DesktopSizeMB
"@
$columns -split "`n" |%{$data | add-member -membertype noteproperty -name $_.trim() -value $null}

#Store a list of computers that we couldn't connect to
$failedcomputers = New-Object System.Collections.ArrayList

#Store the results of the gathered data
$foldersize = New-Object System.Collections.ArrayList

#Root OU that you want to start searching for computers
$RootOU = "yourdomain.org/your ou/ your sub-ou"

#Getting a list of all computers
$allcomputers = Get-QADComputer -SearchRoot "$rootou" -SizeLimit 0

#Export paths
$failedcomputersfiles = "c:\yourpath\yourfile.csv"
$foldersizefile = "c:\yourpath\yourfile.csv"

#Looping through each computer
Foreach ($computer in $allcomputers)
   {
#Seeing if we can connect to the computer, if not, we're going to add it to the failedcomputers array.
   If (Test-Path "\\$($computer.name)\c$")
       {
#Setting the two possiable paths based on whether its Windows 7 or XP
       $Windows7ProfileRoot = "\\$($computer.name)\c$\Users"
       $WindowsXPProfileRoot = "\\$($computer.name)\c$\Documents and Settings"
#if the computer is windows 7 run this, or go to the else statement
       If ($($computer.OSName) -like "Windows 7*")
           {
#getting a list of profiles
           $allprofiles = Get-ChildItem $Windows7ProfileRoot | Where-Object {$_.PSIsContainer -eq $true}
#Looping through each profile and running the following.
           Foreach ($user in $allprofiles)
               {
               $data.ComputerName = $computer.name
               $data.ProfileName = $user.name
               $userdesktop = (Get-ChildItem "$Windows7ProfileRoot\$($user.name)\desktop" -recurse | Measure-Object -property length -sum).sum / 1MB
               $userdocuments = (Get-ChildItem "$Windows7ProfileRoot\$($user.name)\documents" -recurse | Measure-Object -property length -sum).sum / 1MB
               $data.DesktopSizeMB = $userdesktop
               $data.DocumentsSizeMB = $userdocuments
               $data | Select-Object * | ForEach-Object {$foldersize.Add($_)}
               }
           }
       Else
           {
           $allprofiles = Get-ChildItem $WindowsXPProfileRoot | Where-Object {$_.PSIsContainer -eq $true}
           Foreach ($user in $allprofiles)
               {
               $data.ComputerName = $computer.name
               $data.ProfileName = $user.name
               $userdesktop = (Get-ChildItem "$WindowsXPProfileRoot\$($user.name)\desktop" -recurse | Measure-Object -property length -sum).sum / 1MB
               $userdocuments = (Get-ChildItem "$WindowsXPProfileRoot\$($user.name)\my documents" -recurse | Measure-Object -property length -sum).sum / 1MB
               $data.DesktopSizeMB = $userdesktop
               $data.DocumentsSizeMB = $userdocuments
               $data | Select-Object * | ForEach-Object {$foldersize.Add($_)}
               $data
               }
           }
       }
   Else
       {
       $failedcomputers.Add("$($computer.name)")
       }
   }

$failedcomputers | Export-Csv $failedcomputersfiles -NoTypeInformation
$foldersize | Export-Csv $foldersizefile -NoTypeInformation

引用自:https://serverfault.com/questions/354466