Scripting
VBscript 獲取使用者的文件和桌面文件夾大小
我一直在網上搜尋一個體面的腳本,以允許我收集 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