UMU WSH Git:http://git.oschina.net/umu618/umu-wsh
' 47_RenameFileByLastModifiedTime.VBS
' UMU @ 0:21 2014/12/4
' [UMU WSH 教程](47) FSO 应用实例 - 按文件最后修改时间批量重命名
' Test code:
' MsgBox WScript.ScriptFullName, , GetFileModifiedTime(WScript.ScriptFullName)
Option Explicit
Const APP_TITLE = "UMU.Script.Tools.RenameFileByLastModifiedTime"
Const APP_DESCRIPTION = "本程序用来把文件按最后修改时间批量重命名。"
Const APP_USAGE = "请把要处理的文件或文件夹拖放到本程序的图标上!"
Dim args, fso, wi
Set args = WScript.Arguments
Set fso = CreateObject("Scripting.FileSystemObject")
Set wi = CreateObject("WindowsInstaller.Installer")
If args.Count = 0 Then
Usage()
Else
Dim is_move
Dim target_directory
Dim is_logging
Dim log_file
Dim succeeded_count, failed_count, exists_count
Main()
End If
Set args = Nothing
Set fso = Nothing
Set wi = Nothing
Private Sub Usage()
Dim wsh
Dim send_to, copy_to
MsgBox APP_DESCRIPTION & vbCrLf & APP_USAGE, vbInformation, APP_TITLE
Set wsh = CreateObject("WScript.Shell")
send_to = wsh.SpecialFolders("SendTo")
copy_to = send_to & "\" & APP_TITLE & ".VBE"
Dim copy_to_sendto
If Not fso.FileExists(copy_to) Then
copy_to_sendto = True
ElseIf Not IsFileTheSame(copy_to, WScript.ScriptFullName) Then
copy_to_sendto = True
Else
copy_to_sendto = False
End If
If copy_to_sendto Then
If vbOK = MsgBox(APP_DESCRIPTION & vbCrLf & APP_USAGE & vbCrLf & vbCrLf & _
"提示:您可以把此文件放在 Sendto 目录里,然后使用右键菜单的“发送到”。" & vbCrLf & _
"您的 Sendto 目录是 " & send_to & vbCrLf & "按“确定”执行复制操作。", _
vbOKCancel + vbInformation, APP_TITLE) Then
fso.CopyFile WScript.ScriptFullName, copy_to
If vbYes = MsgBox("是否查看 Sendto 目录?", vbQuestion + vbYesNo, APP_TITLE) Then
wsh.Run "%SystemRoot%\explorer.exe /n, /select," & copy_to
End If
End If
End If
Set wsh = Nothing
End Sub
Private Sub Main()
is_move = MsgBox("重命名文件?按“否”复制文件,按“取消”退出!", vbYesNoCancel + vbQuestion, "询问")
If vbCancel = is_move Then
Exit Sub
End If
is_logging = MsgBox("产生日志?按“取消”退出!", vbYesNoCancel + vbQuestion, "询问")
If vbCancel = is_logging Then
Exit Sub
End If
If is_logging = vbYes Then
Set log_file = fso.CreateTextFile(fso.GetSpecialFolder(2) & "\" & APP_TITLE & ".log")
End If
target_directory = InputBox("请输入存放目录:", "存放目录")
If Len(target_directory) = 0 Then
Exit Sub
End If
If Not fso.FolderExists(target_directory) Then
MsgBox target_directory, vbError, "存放目录不存在"
Exit Sub
End If
If Right(target_directory, 1) <> "\" Then
target_directory = target_directory & "\"
End If
succeeded_count = 0
failed_count = 0
exists_count = 0
Dim ar
For Each ar In args
If fso.FolderExists(ar) Then
Call RenameFileByLastModifiedTime_s(ar)
ElseIf fso.FileExists(ar) Then
Call RenameFileByLastModifiedTime(ar)
End If
Next
If is_logging = vbYes Then
log_file.Close
Set log_file = Nothing
End If
MsgBox "重命名 " & succeeded_count & " 个,失败 " & failed_count & _
" 个,文件已经存在 " & exists_count & " 个!", 4160, "整个世界清净了!"
End Sub
Private Sub RenameFileByLastModifiedTime_s(ByVal folder_path)
'On Error Resume Next
Dim rfd, fs, f, fds, fd
Set rfd = fso.GetFolder(folder_path)
Set fs = rfd.Files
For Each f In fs
Call RenameFileByLastModifiedTime(f.Path)
Next
Set fds = rfd.SubFolders
For Each fd In fds
Call RenameFileByLastModifiedTime_s(fd.Path)
Next
End Sub
Private Sub RenameFileByLastModifiedTime(ByRef file_path)
'On Error Resume Next
Dim dt
dt = GetFileModifiedTime(file_path)
If Len(dt) > 0 Then
Dim y, m
Dim path
y = Left(dt, 4)
m = Mid(dt, 6, 2)
path = target_directory & y
If Not fso.FolderExists(path) Then
Call fso.CreateFolder(path)
End If
path = path & "\" & y & "-" & m
If Not fso.FolderExists(path) Then
Call fso.CreateFolder(path)
End If
If Err.Number <> 0 Then
failed_count = failed_count + 1
Err.Clear
Exit Sub
End If
Dim ext
ext = Mid(file_path, InStrRev(file_path, "."))
path = path & "\" & dt & ext
If fso.FileExists(path) Then
exists_count = exists_count + 1
If IsFileTheSame(file_path, path) Then
fso.DeleteFile file_path
If is_logging = vbYes Then
log_file.WriteLine "~" & file_path
log_file.WriteLine "@" & path
log_file.WriteLine "----------------"
End If
Else
If is_logging = vbYes Then
log_file.WriteLine file_path
log_file.WriteLine "@" & path
log_file.WriteLine "----------------"
End If
End If
ElseIf vbYes = is_move Then
fso.MoveFile file_path, path
If Err.Number <> 0 Then
failed_count = failed_count + 1
Err.Clear
If is_logging = vbYes Then
log_file.WriteLine "~" & file_path
log_file.WriteLine "-" & path
log_file.WriteLine "----------------"
End If
Else
succeeded_count = succeeded_count + 1
If is_logging = vbYes Then
log_file.WriteLine "~" & file_path
log_file.WriteLine "+" & path
log_file.WriteLine "----------------"
End If
End If
Else
fso.CopyFile file_path, path
If Err.Number <> 0 Then
failed_count = failed_count + 1
Err.Clear
If is_logging = vbYes Then
log_file.WriteLine "&" & file_path
log_file.WriteLine "-" & path
log_file.WriteLine "----------------"
End If
Else
succeeded_count = succeeded_count + 1
If is_logging = vbYes Then
log_file.WriteLine "&" & file_path
log_file.WriteLine "+" & path
log_file.WriteLine "----------------"
End If
End If
End If
Else
' 没有拍照日期
If is_logging = vbYes Then
log_file.WriteLine file_path
log_file.WriteLine "!"
log_file.WriteLine "----------------"
End If
End If
End Sub
Private Function TimeValue(num)
TimeValue = Right("0" & num, 2)
End Function
Private Function MyFormatDateTime(ByRef dt)
MyFormatDateTime = Year(dt) & "-" & TimeValue(Month(dt)) & "-" & TimeValue(Day(dt)) & "_" & TimeValue(Hour(dt)) & "-" & TimeValue(Minute(dt)) & "-" & TimeValue(Second(dt))
End Function
Private Function GetFileModifiedTime(ByRef file_path)
On Error Resume Next
GetFileModifiedTime = ""
Dim file
Set file = fso.GetFile(file_path)
GetFileModifiedTime = MyFormatDateTime(file.DateLastModified)
Set file = Nothing
End Function
Private Function BigEndianHex(int)
Dim result
Dim b1, b2, b3, b4
result = Right("0000000" & Hex(int), 8)
b1 = Mid(result, 7, 2)
b2 = Mid(result, 5, 2)
b3 = Mid(result, 3, 2)
b4 = Mid(result, 1, 2)
BigEndianHex = b1 & b2 & b3 & b4
End Function
Private Function GetFileHash(file_name)
Dim file_hash
Dim hash_value
Dim i
Set file_hash = wi.FileHash(file_name, 0)
hash_value = ""
For i = 1 To file_hash.FieldCount
hash_value = hash_value & BigEndianHex(file_hash.IntegerData(i))
Next
Set file_hash = Nothing
GetFileHash = hash_value
End Function
Private Function IsFileTheSame(ByRef file1, ByRef file2)
If 0 = StrComp(file1, file2, vbTextCompare) Then
IsFileTheSame = True
Else
Dim hash1, hash2
hash1 = GetFileHash(file1)
hash2 = GetFileHash(file2)
If hash1 = hash2 And Len(hash1) > 0 Then
IsFileTheSame = True
Else
IsFileTheSame = False
End If
End If
End Function