打印

[原创] 统计文件夹中子文件夹和文件的所有者

本主题由 mwpq 于 2008-1-7 11:06 关闭

5.1版

相对5.0来说改进不大& v# e7 S" N1 @* V
仍然不能显示域用户所有的文件/ v! ?6 c1 j; h7 f, [( x# Y% v. h, G
将生成的文件合并到一个文件中,不至于显得太乱,并在最后自动打开结果文件
复制内容到剪贴板
代码:
G = WScript.arguments(0)


Set oFSO = CreateObject("Scripting.FileSystemObject")
Set TXT0 = oFSO.OpenTextFile (G &"\ALLTXT.TXT",8,true)
Set TXT1 = oFSO.OpenTextFile (G &"\Other_TXT.TXT",8,true)
Set objWMI = GetObject("winmgmts:")
Set oFiles = objWMI.ExecQuery("ASSOCIATORS OF {Win32_Directory.Name='"&G&"'}" & "where ResultClass =

CIM_logicalfile")

Set objNetwork = CreateObject("Wscript.Network")
strComputer = objNetwork.ComputerName
Set colAccounts = GetObject("WinNT://" & strComputer & "")
colAccounts.Filter = Array("user")



'统计每个用户的文件和文件夹
For Each objUser In colAccounts
TotalSize = 0
H = objUser.Name
Set TXT = oFSO.CreateTextFile (G & "\" & objUser.Name & "_TXT.TXT",true)

For Each oFile In oFiles
strFile = oFile.name
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colItems = objWMIService.ExecQuery ("ASSOCIATORS OF {Win32_LogicalFileSecuritySetting='" & strFile &

"'}" & " WHERE AssocClass =Win32_LogicalFileOwner ResultRole=Owner")

For Each objItem in colItems
If objItem.AccountName = H then
TXT.WriteLine( "--------------------------------------------------------------")
TXT.WriteLine( oFile.name)
TXT.WriteLine( "类型: " & oFile.FileType)

If oFile.name = G&"system volume information" then
exit for
End If

S = 0

If oFile.FileType="File Folder" then
Set objFolder = oFSO.GetFolder(oFile.name)
S= Cint(objFolder.Size/1024/1024)
Else
S= Cint(oFile.FileSize/1024/1024)
End If

TXT.WriteLine( "大小: " & S &"MB")
TotalSize = TotalSize + S
End If
Next

Next
TXT.WriteLine( "--------------------------------------------------------------")
TXT.WriteLine( "属于用户 "&H&" 的文件和文件夹总大小为: " & TotalSize &"MB")
TXT.WriteLine( "※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※")
Next
TXT.Close


'统计属于管理员组及不明用户的文件和文件夹

TotalSize = 0
TotalSize1 = 0


For Each oFile In oFiles
strFile = oFile.name
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colItems = objWMIService.ExecQuery ("ASSOCIATORS OF {Win32_LogicalFileSecuritySetting='" & strFile & "'}" &

" WHERE AssocClass =Win32_LogicalFileOwner ResultRole=Owner")

For Each objItem in colItems
If objItem.AccountName = "Administrators" then
TXT0.WriteLine( "--------------------------------------------------------------")
TXT0.WriteLine( oFile.name)
TXT0.WriteLine( "类型: " & oFile.FileType)

If oFile.name = G&"system volume information" then
exit for
End If

S = 0

If oFile.FileType="File Folder" then
Set objFolder = oFSO.GetFolder(oFile.name)
S= Cint(objFolder.Size/1024/1024)
Else
S= Cint(oFile.FileSize/1024/1024)
End If

TXT0.WriteLine( "大小: " & S &"MB")
TotalSize = TotalSize + S

ElseIf objItem.AccountName = "" then
TXT1.WriteLine( "--------------------------------------------------------------")
TXT1.WriteLine( oFile.name)
TXT1.WriteLine( "类型: " & oFile.FileType)

If oFile.name = G&"system volume information" then
exit for
End If

S = 0

If oFile.FileType="File Folder" then
Set objFolder = oFSO.GetFolder(oFile.name)
S= Cint(objFolder.Size/1024/1024)
Else
S= Cint(oFile.FileSize/1024/1024)
End If

TXT1.WriteLine( "大小: " & S &"MB")
TotalSize1 = TotalSize1 + S
End If
Next
Next
TXT0.WriteLine( "--------------------------------------------------------------")
TXT0.WriteLine( "属于Administrators的文件和文件夹总大小为: " & TotalSize &"MB")
TXT0.WriteLine( "※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※")
TXT1.WriteLine( "--------------------------------------------------------------")
TXT1.WriteLine( "属于不明用户的文件和文件夹总大小为: " & TotalSize1 &"MB")
TXT1.WriteLine( "※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※")
TXT1.Close
'合并所有结果文件
Set TXT1 = oFSO.OpenTextFile (G &"\Other_TXT.TXT",1)
strtxt = TXT1.ReadAll
TXT0.WriteLine strtxt
TXT1.Close


For Each objUser In colAccounts
Set TXT = oFSO.OpenTextFile (G & "\" & objUser.Name & "_TXT.TXT",1)
strtxt = TXT.ReadAll
TXT0.WriteLine strtxt
TXT.Close
Next

TXT0.Close

oFSO.DeleteFile G&"\*_TXT.TXT"

MsgBox "统计完成,结果保存在"&G&"中生成的ALLTXT.TXT文件中",64,"OK"

Set objshell = CreateObject("Wscript.Shell")
objshell.run "notepad.exe "&G&"\"&"ALLTXT.TXT"
考完试鸟,心力憔悴呀~~~~接下来,准备补考

TOP

程序小的时候,没怎么注意流程问题
7 R$ w7 y/ V& L1 c2 Z1 A
1 J# ] o7 y- ^9 w: d& d; K- d# M9 W越写越大,发现,流程真滴是好重要亚`~~~~
" p, `# S9 B* p! \! O1 U; [! K, h0 ^& Y8 ^6 m
BUG发现了好多~~~~ , p% B1 \& `: P* y$ G4 Q3 q% m' P A2 w
1 k. p5 |9 A" Q9 F
虽然说学习的乐趣是穷的,但一个人走路真滴很累~~~~ ) R* I/ e# J( H5 |
# p! r( g; f$ ?9 W9 W
谁发现了BUG,指正出来的一律+10分
考完试鸟,心力憔悴呀~~~~接下来,准备补考

TOP

5.2 注释版

相对5.1版,没有多少实际性的改进,修改了几处容易产生错误的地方
; e; \8 s8 H5 h9 o8 r( j将输入方式改为弹出提示输入框,这样就不必在命令行中使用,可以直接双击
8 [3 o: D6 X, E) R, g主要是加入了注释,方便跟我一样的脚本学习者借鉴(如果它有这种价值的话 )
复制内容到剪贴板
代码:


G = InputBox("请输入你要统计的盘符或目录: ","统计目录")
'检查输入的目录字符串是否在最后有"\",如果没有则加上
If InStrRev(G,"\")<Len(G) Then
G = G & "\"
End If
Set oFSO = CreateObject("Scripting.FileSystemObject") '创建一个文件系统对象
'检查输入的目录是否存在
If Not (oFSO.FolderExists(G)) Then
MsgBox "输入的目录"&G&"不存在,程序终止",16,"错误"
Wscript.Quit
End If
Set TXT0 = oFSO.OpenTextFile (G &"ALLTXT.TXT",8,true) '创建文本文件,用来记录administrators的文件和文件夹,并在最后合并所有用户
Set TXT1 = oFSO.OpenTextFile (G &"Other_TXT.TXT",8,true) '用来记录不明用户
Set objWMI = GetObject("winmgmts:") '本句和下句是获取一个WMI对象,用来检索目录中的文件和文件夹
Set oFiles = objWMI.ExecQuery("ASSOCIATORS OF {Win32_Directory.Name='"&G&"'}" & "where ResultClass = CIM_logicalfile")
Set objNetwork = CreateObject("Wscript.Network") '创建一个Wscript.Network对象,用来获取所有用户的列表
strComputer = objNetwork.ComputerName
Set colAccounts = GetObject("WinNT://" & strComputer & "")
colAccounts.Filter = Array("user")

'统计每个用户的文件和文件夹

For Each objUser In colAccounts '对每个用户来分别检索所有文件,其实这样效率很低,所以该程序执行时间有点长
TotalSize = 0
H = objUser.Name
Set TXT = oFSO.CreateTextFile (G & objUser.Name & "_TXT.TXT",true) '为每一个用户创建一个"用户名_TXT.TXT"的文本文件
For Each oFile In oFiles '枚举检索到的每一个文件或文件夹
strFile = oFile.name
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colItems = objWMIService.ExecQuery ("ASSOCIATORS OF {Win32_LogicalFileSecuritySetting='" & strFile & "'}" & " WHERE AssocClass =
Win32_LogicalFileOwner ResultRole=Owner") '检索文件的安全设置,找到OWNER
For Each objItem in colItems '检查OWNER是否当前用户,如果是的话,就记录到当前用户的TXT文件中
If objItem.AccountName = H then
TXT.WriteLine( "--------------------------------------------------------------")
TXT.WriteLine( oFile.name)
TXT.WriteLine( "类型: " & oFile.FileType)
'跳过检索目录本身,如果输入的目录是根盘符,也跳过其中的system volume information目录,否则会提示无权限
If oFile.name = G&"system volume information" OR oFile.name = G then
exit for
End If
S = 0
'检查当前对象是文件还是文件夹,两者采用不同的方式获取大小
If oFile.FileType="File Folder" then
Set objFolder = oFSO.GetFolder(oFile.name)
S= Cint(objFolder.Size/1024/1024)
Else
S= Cint(oFile.FileSize/1024/1024)
End If
TXT.WriteLine( "大小: " & S &"MB")
TotalSize = TotalSize + S
End If
Next
Next
TXT.WriteLine( "--------------------------------------------------------------")
TXT.WriteLine( "属于用户 "&H&" 的文件和文件夹总大小为: " & TotalSize &"MB")
TXT.WriteLine( "※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※")
Next
TXT.Close

'统计属于管理员组及不明用户的文件和文件夹
TotalSize = 0
TotalSize1 = 0

For Each oFile In oFiles
strFile = oFile.name
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colItems = objWMIService.ExecQuery ("ASSOCIATORS OF {Win32_LogicalFileSecuritySetting='" & strFile & "'}" & " WHERE AssocClass = Win32_LogicalFileOwner
ResultRole=Owner")
For Each objItem in colItems
If objItem.AccountName = "Administrators" then
TXT0.WriteLine( "--------------------------------------------------------------")
TXT0.WriteLine( oFile.name)
TXT0.WriteLine( "类型: " & oFile.FileType)
If oFile.name = G&"system volume information" OR oFile.name = G then
exit for
End If
S = 0
If oFile.FileType="File Folder" then
Set objFolder = oFSO.GetFolder(oFile.name)
S= Cint(objFolder.Size/1024/1024)
Else
S= Cint(oFile.FileSize/1024/1024)
End If
TXT0.WriteLine( "大小: " & S &"MB")
TotalSize = TotalSize + S
ElseIf objItem.AccountName = "" then
TXT1.WriteLine( "--------------------------------------------------------------")
TXT1.WriteLine( oFile.name)
TXT1.WriteLine( "类型: " & oFile.FileType)
If oFile.name = G&"system volume information" then
exit for
End If
S = 0
If oFile.FileType="File Folder" then
Set objFolder = oFSO.GetFolder(oFile.name)
S= Cint(objFolder.Size/1024/1024)
Else
S= Cint(oFile.FileSize/1024/1024)
End If
TXT1.WriteLine( "大小: " & S &"MB")
TotalSize1 = TotalSize1 + S
End If
Next
Next
TXT0.WriteLine( "--------------------------------------------------------------")
TXT0.WriteLine( "属于Administrators的文件和文件夹总大小为: " & TotalSize &"MB")
TXT0.WriteLine( "※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※")
TXT1.WriteLine( "--------------------------------------------------------------")
TXT1.WriteLine( "属于不明用户的文件和文件夹总大小为: " & TotalSize1 &"MB")
TXT1.WriteLine( "※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※")
TXT1.Close

'合并所有结果文件
Set TXT1 = oFSO.OpenTextFile (G &"Other_TXT.TXT",1)
strtxt = TXT1.ReadAll
TXT0.WriteLine strtxt
TXT1.Close

For Each objUser In colAccounts
Set TXT = oFSO.OpenTextFile (G & objUser.Name & "_TXT.TXT",1)
strtxt = TXT.ReadAll
TXT0.WriteLine strtxt
TXT.Close
Next
TXT0.Close
oFSO.DeleteFile G&"*_TXT.TXT"
MsgBox "统计完成,结果保存在"&G&"中生成的ALLTXT.TXT文件中",64,"OK"
Set objshell = CreateObject("Wscript.Shell")
objshell.run "notepad.exe " & G & "ALLTXT.TXT"
考完试鸟,心力憔悴呀~~~~接下来,准备补考

TOP

北羊大哥,可惜我对脚本完全不懂,不然老早给你找错误了!!!!

TOP

引用:
原帖由 live-share 于 2007-11-30 09:17 发表
) Q0 H. ~9 Z; `, R: r$ c3 c$ ^3 I北羊大哥,可惜我对脚本完全不懂,不然老早给你找错误了!!!!
. _& }0 s7 Y3 a& V
7 m& l/ E- j0 F我刚开始学写这东西,也就两个月~~~~你看我发的帖子就知道了 一个人学,有点难,两个人一起学会好很多,论坛是个交流的好地方,可惜,最近菊花有点冷清
考完试鸟,心力憔悴呀~~~~接下来,准备补考

TOP

是啊,但还是期待你的可以查找域用户的版本

TOP

6.0

不好意思,没有实现查找域用户的功能,周末一直在上课,没什么时间,要实现域用户功能,其实也简单,目前我主要是不确定域用户在所有者列表里是怎么表示的# w T% e' d" Q2 ^
附件中的TXT直接下载就行了,我排好了格式,看着比较舒服% X* Y, H u* u4 X2 k! }: [
哪位达人如果觉得这个东西有修改的价值,希望修改后能给俺过过目,学习一下% T" E5 p' O8 a# g9 @% b
& P: f7 b2 U1 B) t
添加的功能是:
W) V k/ y8 Z1.实现了两栖功能,也就是说,可以直接双击执行,也可以在命令行下用目录名做参数来执行~~~这个是我在上课时突然跳出来的念头.5.1只能在命令行下使用,5.2又不能在命令行下使用,我试着添加了几句判断语句,发现实现起来没有想象中那么难,呵呵,主要是对WScript.arguments的判断
$ n, { U* q- }- ~) `
! c5 ?! W. ~/ q; A4 Q! @0 q2.判断参数,如果最后一位是问号,则弹出窗口,说明使用方法5 L$ f4 ]; \6 z. i9 U3 x) K
3 N2 Q- d7 H7 k+ ]
3.如果输入为空,自动退出,不会再报错
复制内容到剪贴板
代码:

'查看是否有参数,如果有参数,则统计参数所指的目录,如果没有参数,则提示用户输入
If WScript.arguments.count = 0 Then
G = InputBox("本程序将统计目录中文件和文件夹的所有者"&Chr(10)&Chr(10)&"请输入你要统计的盘符或目录: ","统计目录")
Else
G = WScript.arguments(0)
End If
'如果参数最后一位是:"?",则弹出窗口提供简单说明
If Right(G,1)="?" Then
MsgBox "本程序将统计目录中所有文件和文件夹的所有者"&Chr(10)&Chr(10)&"使用方法:"&Chr(10)&"命令行下: '脚本名 目录名' 或者直接双击执行",64,"使用说明"
Wscript.Quit
End If
'如果输入为空则退出
If G = "" Then
Wscript.Quit
End If
'检查输入的目录字符串是否在最后有"\",如果没有则加上
If InStrRev(G,"\")<Len(G) Then
G = G & "\"
End If
Set oFSO = CreateObject("Scripting.FileSystemObject") '创建一个文件系统对象
'检查输入的目录是否存在
If Not (oFSO.FolderExists(G)) Then
MsgBox "输入的目录"&G&"不存在,程序终止",16,"错误"
Wscript.Quit
End If
Set TXT0 = oFSO.OpenTextFile (G &"ALLTXT.TXT",8,true) '创建文本文件,用来记录administrators的文件和文件夹,并在最后合并所有用户
Set TXT1 = oFSO.OpenTextFile (G &"Other_TXT.TXT",8,true) '用来记录不明用户
Set objWMI = GetObject("winmgmts:") '本句和下句是获取一个WMI对象,用来检索目录中的文件和文件夹
Set oFiles = objWMI.ExecQuery("ASSOCIATORS OF {Win32_Directory.Name='"&G&"'}" & "where ResultClass = CIM_logicalfile")
Set objNetwork = CreateObject("Wscript.Network") '创建一个Wscript.Network对象,用来获取所有用户的列表
strComputer = objNetwork.ComputerName
Set colAccounts = GetObject("WinNT://" & strComputer & "")
colAccounts.Filter = Array("user")
'统计每个用户的文件和文件夹
For Each objUser In colAccounts '对每个用户来分别检索所有文件,其实这样效率很低,所以该程序执行时间有点长
TotalSize = 0
H = objUser.Name
Set TXT = oFSO.CreateTextFile (G & objUser.Name & "_TXT.TXT",true) '为每一个用户创建一个"用户名_TXT.TXT"的文本文件
For Each oFile In oFiles '枚举检索到的每一个文件或文件夹
strFile = oFile.name
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colItems = objWMIService.ExecQuery ("ASSOCIATORS OF {Win32_LogicalFileSecuritySetting='" & strFile & "'}" & " WHERE AssocClass = Win32_LogicalFileOwner ResultRole=Owner") '检索文件的安全设置,找到OWNER
For Each objItem in colItems '检查OWNER是否当前用户,如果是的话,就记录到当前用户的TXT文件中
If objItem.AccountName = H then
TXT.WriteLine( "--------------------------------------------------------------")
TXT.WriteLine( oFile.name)
TXT.WriteLine( "类型: " & oFile.FileType)
'跳过检索目录本身,如果输入的目录是根盘符,也跳过其中的system volume information目录,否则会提示无权限
If oFile.name = G&"system volume information" OR oFile.name = G then
exit for
End If
S = 0
'检查当前对象是文件还是文件夹,两者采用不同的方式获取大小
If oFile.FileType="File Folder" then
Set objFolder = oFSO.GetFolder(oFile.name)
S= Cint(objFolder.Size/1024/1024)
Else
S= Cint(oFile.FileSize/1024/1024)
End If
TXT.WriteLine( "大小: " & S &"MB")
TotalSize = TotalSize + S
End If
Next
Next
TXT.WriteLine( "--------------------------------------------------------------")
TXT.WriteLine( "属于用户 "&H&" 的文件和文件夹总大小为: " & TotalSize &"MB")
TXT.WriteLine( "※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※")
Next
TXT.Close
'统计属于管理员组及不明用户的文件和文件夹
TotalSize = 0
TotalSize1 = 0
For Each oFile In oFiles
strFile = oFile.name
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colItems = objWMIService.ExecQuery ("ASSOCIATORS OF {Win32_LogicalFileSecuritySetting='" & strFile & "'}" & " WHERE AssocClass = Win32_LogicalFileOwner ResultRole=Owner")
For Each objItem in colItems
If objItem.AccountName = "Administrators" then
TXT0.WriteLine( "--------------------------------------------------------------")
TXT0.WriteLine( oFile.name)
TXT0.WriteLine( "类型: " & oFile.FileType)
If oFile.name = G&"system volume information" OR oFile.name = G then
exit for
End If
S = 0
If oFile.FileType="File Folder" then
Set objFolder = oFSO.GetFolder(oFile.name)
S= Cint(objFolder.Size/1024/1024)
Else
S= Cint(oFile.FileSize/1024/1024)
End If
TXT0.WriteLine( "大小: " & S &"MB")
TotalSize = TotalSize + S
ElseIf objItem.AccountName = "" then
TXT1.WriteLine( "--------------------------------------------------------------")
TXT1.WriteLine( oFile.name)
TXT1.WriteLine( "类型: " & oFile.FileType)
If oFile.name = G&"system volume information" then
exit for
End If
S = 0
If oFile.FileType="File Folder" then
Set objFolder = oFSO.GetFolder(oFile.name)
S= Cint(objFolder.Size/1024/1024)
Else
S= Cint(oFile.FileSize/1024/1024)
End If
TXT1.WriteLine( "大小: " & S &"MB")
TotalSize1 = TotalSize1 + S
End If
Next
Next
TXT0.WriteLine( "--------------------------------------------------------------")
TXT0.WriteLine( "属于Administrators的文件和文件夹总大小为: " & TotalSize &"MB")
TXT0.WriteLine( "※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※")
TXT1.WriteLine( "--------------------------------------------------------------")
TXT1.WriteLine( "属于不明用户的文件和文件夹总大小为: " & TotalSize1 &"MB")
TXT1.WriteLine( "※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※")
TXT1.Close
'合并所有结果文件
Set TXT1 = oFSO.OpenTextFile (G &"Other_TXT.TXT",1)
strtxt = TXT1.ReadAll
TXT0.WriteLine strtxt
TXT1.Close
For Each objUser In colAccounts
Set TXT = oFSO.OpenTextFile (G & objUser.Name & "_TXT.TXT",1)
strtxt = TXT.ReadAll
TXT0.WriteLine strtxt
TXT.Close
Next
TXT0.Close
oFSO.DeleteFile G&"*_TXT.TXT"
MsgBox "统计完成,结果保存在"&G&"中生成的ALLTXT.TXT文件中",64,"OK"
Set objshell = CreateObject("Wscript.Shell")
objshell.run "notepad.exe " & G & "ALLTXT.TXT"
附件: 您所在的用户组无法下载或查看附件
我说了我不想哭,可是你为什么老下雨~~~

TOP

引用:
原帖由 live-share 于 2007-11-29 16:55 发表
0 T/ t7 o f$ L4 `1 C7 ?5.0的清楚很多了,但都是只能统计属于本地用户所创建文件,不能统计属于域用户的文件哦。
+ v" f @3 Q7 n5 t I& S( t0 s0 q' p7 Y
我这里没有域环境,能不能告诉我域环境里文件所有者是怎么显示的?
0 ^4 N2 [" b, u+ Y/ a+ ~; g, P: I1 _# |
域名/用户名? 域名\用户名? 用户名@域名?
考完试鸟,心力憔悴呀~~~~接下来,准备补考

TOP

抓个图给你看吧,这样还清楚些
附件: 您所在的用户组无法下载或查看附件

TOP

谢谢楼主分享哈~!!!

TOP

引用:
原帖由 live-share 于 2007-12-6 10:35 发表 - o$ d% f+ ?8 a9 g5 Z9 R2 R
抓个图给你看吧,这样还清楚些
6 E. y8 b2 d" T/ L& S% G! G8 l
谢了,我现在深圳,回到广州马上改
我说了我不想哭,可是你为什么老下雨~~~

TOP

期待哦!!!!!!!!

TOP

我的问题也期待你的回来了~

TOP

要统计文件夹大小和数量等用个专用的文件统计软件就可以了,还可以用图形方式显示出来,网上有很多,当然鼓励原创的脚本,可以学习到更多的东西.

TOP

不好意思,最近比较忙,拖到现在

因为域用户数量太多,不可能按原来的方式以用户为遍历标准
- q- n, R, x: N" S2 K6 ]' F& U" p
所以换回原来的程序流程,直接把所有文件的信息列出来,不过,不再是导入TXT文件,而是换成EXCEL文件,这样,结果出来后,就可以手动计算了
5 i7 O d! L( B- x
复制内容到剪贴板
代码:

'查看是否有参数,如果有参数,则统计参数所指的目录,如果没有参数,则提示用户输入
If WScript.arguments.count = 0 Then
G = InputBox("本程序将统计目录中文件和文件夹的所有者"&Chr(10)&Chr(10)&"请输入你要统计的盘符或目录: ","统计目录")
Else
G = WScript.arguments(0)
End If
'如果参数最后一位是:"?",则弹出窗口提供简单说明
If Right(G,1)="?" Then
MsgBox "本程序将统计目录中所有文件和文件夹的所有者"&Chr(10)&Chr(10)&"使用方法:"&Chr(10)&"命令行下: '脚本名 目录名' 或者直接双击执行",64,"使用说明"
Wscript.Quit
End If
'如果输入为空则退出
If G = "" Then
Wscript.Quit
End If
'检查输入的目录字符串是否在最后有"\",如果没有则加上
If InStrRev(G,"\")<LEN(G) Then
G = G & "\"
End If
Set oFSO = CreateObject("Scripting.FileSystemObject") '创建一个文件系统对象
'检查输入的目录是否存在
If Not (oFSO.FolderExists(G)) Then
MsgBox "输入的目录"&G&"不存在,程序终止",16,"错误"
Wscript.Quit
End If
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set objWMI = GetObject("winmgmts:")
Set oFiles = objWMI.ExecQuery("ASSOCIATORS OF {Win32_Directory.Name='"&G&"'}" & "where ResultClass = CIM_logicalfile")
Set objExcel = CreateObject("Excel.Application")
objExcel.Workbooks.Add
objExcel.Visible = True
objExcel.cells(1,1).value = "Name"
objExcel.cells(1,2).value = "Type"
objExcel.cells(1,3).value = "Size(MB)"
objExcel.cells(1,4).value = "owner"
Set objRange = objExcel.Range("A1","D1")
objRange.Interior.ColorIndex = 36
i = 2
For Each oFile In oFiles
strFile = oFile.name
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colItems = objWMIService.ExecQuery ("ASSOCIATORS OF {Win32_LogicalFileSecuritySetting='" & strFile & "'}" & " WHERE AssocClass=Win32_LogicalFileOwner ResultRole=Owner")
For Each objItem in colItems
if oFile.name = G&"system volume information" then
exit for
end if
S = 0
if oFile.FileType="File Folder" then
Set objFolder = oFSO.GetFolder(oFile.name)
S= Cint(objFolder.Size/1024/1024)
else
S= Cint(oFile.FileSize/1024/1024)
end if
objExcel.cells(i,1).value = oFile.Name
objExcel.cells(i,2).value = oFile.FileType
objExcel.cells(i,3).value = S
objExcel.cells(i,4).value = objItem.AccountName
TotalSize = TotalSize + S
i = i + 1
Next
Next
Set objRange = objExcel.Range("D1")
objRange.Sort objRange,,,,,,,1
Set objRange = objExcel.ActiveCell.EntireColumn
objRange.AutoFit()
set objbook = objExcel.activeWorkbook
objbook.saveas("c:\listowner.xls")
MsgBox "文件信息已成功输出至c:\listowner.xls文件",64,"OK"
考完试鸟,心力憔悴呀~~~~接下来,准备补考

TOP

运行出错了啊!!在第43行!!
附件: 您所在的用户组无法下载或查看附件

TOP

7.0修整版4 N- y& e* [3 j8 k' ]* k8 Q
应该可以显示所有者为域用户的文件信息了
复制内容到剪贴板
代码:
'查看是否有参数,如果有参数,则统计参数所指的目录,如果没有参数,则提示用户输入
If WScript.arguments.count = 0 Then
G = InputBox("本程序将统计目录中文件和文件夹的所有者"&Chr(10)&Chr(10)&"请输入你要统计的盘符或目录: ","统计目录")
Else
G = WScript.arguments(0)
End If

'如果参数最后一位是:"?",则弹出窗口提供简单说明
If Right(G,1)="?" Then
MsgBox "本程序将统计目录中所有文件和文件夹的所有者"&Chr(10)&Chr(10)&"使用方法:"&Chr(10)&"命令行下: '脚本名 目录名' 或者直接双击执行",64,"使用说明"
Wscript.Quit
End If

'如果输入为空则退出
If G = "" Then
Wscript.Quit
End If

'检查输入的目录字符串是否在最后有"\",如果没有则加上
If InStrRev(G,"\")<LEN(G) Then
G = G & "\"
End If

Set oFSO = CreateObject("Scripting.FileSystemObject") '创建一个文件系统对象
'检查输入的目录是否存在
If Not (oFSO.FolderExists(G)) Then
MsgBox "输入的目录"&G&"不存在,程序终止",16,"错误"
Wscript.Quit
End If
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set objWMI = GetObject("winmgmts:")
Set oFiles = objWMI.ExecQuery("ASSOCIATORS OF {Win32_Directory.Name='"&G&"'}" & "where ResultClass = CIM_logicalfile")

Set objExcel = CreateObject("Excel.Application")
objExcel.DisplayAlerts = False
objExcel.Workbooks.Add
objExcel.Visible = True
objExcel.cells(1,1).value = "Name"
objExcel.cells(1,2).value = "Type"
objExcel.cells(1,3).value = "Size(MB)"
objExcel.cells(1,4).value = "owner"
Set objRange = objExcel.Range("A1","D1")
objRange.Interior.ColorIndex = 36
i = 2

For Each oFile In oFiles
strFile = oFile.name
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colItems = objWMIService.Get("Win32_LogicalFileSecuritySetting='" & strFile & "'")
intRetVal = colItems.GetSecurityDescriptor(objSD)

if oFile.name = G&"system volume information" then
exit for
end if

S = 0

if oFile.FileType="File Folder" then
Set objFolder = oFSO.GetFolder(oFile.name)
S= Cint(objFolder.Size/1024/1024)
else
S= Cint(oFile.FileSize/1024/1024)
end if

objExcel.cells(i,1).value = oFile.Name
objExcel.cells(i,2).value = oFile.FileType
objExcel.cells(i,3).value = S
objExcel.cells(i,4).value = objSD.owner.Domain&"\"&objSD.owner.Name

TotalSize = TotalSize + S
i = i + 1

Next

Set objRange = objExcel.Range("D1")
objRange.Sort objRange,,,,,,,1

Set objRange = objExcel.Range("A1")
objRange.Activate
Set objRange = objExcel.ActiveCell.EntireColumn
objRange.Autofit()
Set objRange = objExcel.Range("B1")
objRange.Activate
Set objRange = objExcel.ActiveCell.EntireColumn
objRange.Autofit()
Set objRange = objExcel.Range("C1")
objRange.Activate
Set objRange = objExcel.ActiveCell.EntireColumn
objRange.Autofit()
Set objRange = objExcel.Range("D1")
objRange.Activate
Set objRange = objExcel.ActiveCell.EntireColumn
objRange.Autofit()


set objbook = objExcel.activeWorkbook
objbook.saveas("c:\listowner.xls")
MsgBox "文件信息已成功输出至c:\listowner.xls文件",64,"OK"
考完试鸟,心力憔悴呀~~~~接下来,准备补考

TOP

引用:
原帖由 live-share 于 2007-12-20 17:34 发表 : L7 L% s3 \+ U \1 h( ]! \& k
运行出错了啊!!在第43行!!
9 j1 i1 P0 j, X/ t7 y# k: G) U你用下面修正版试试,我这儿都是运行正常才帖上来的,兼容性问题/
考完试鸟,心力憔悴呀~~~~接下来,准备补考

TOP

引用:
原帖由 live-share 于 2007-12-20 17:34 发表 % J; T6 l1 p+ A0 W
运行出错了啊!!在第43行!!
! E. S' b; I9 c晕倒,刚刚我自己也出现了这个问题
考完试鸟,心力憔悴呀~~~~接下来,准备补考

TOP

知道怎么回事了,我发现,统计路径是盘符就不会出现这个问题,如果不是盘符而是某个文件夹就会出现这个问题
7 Z5 D I7 s Q O) E% I8 }0x80041002(“无法找到对象”)
4 L3 r6 _5 q( z' L$ Y& K, ?6 O- I' |1 f+ R
这个错误,怪怪的,~~~~解决中
考完试鸟,心力憔悴呀~~~~接下来,准备补考

TOP