Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Single Post  Topic: можно ли быстро заменить файлы в дереве каталогов? 
Author Message
Batya



PostPosted: Mon Jan 26, 2009 12:18    Post subject: Reply with quote

vbs-скрипт:
Code:
'==============================================================================
' Замена указанными файлами одноименных файлов во всех вложенных папках

' Параметры:
' {папка с исходными файлами} {корневая папка, в которой заменяются файлы}

' Пример параметров вызова из TC:
' "%P" "%T"

' Автор - Batya
'==============================================================================
Option Explicit
'================= Изменяемые параметры =======================================
Const ViewSubFolders = False 'Просматривать ли вложенные папки в исходной папке
'==============================================================================
Dim FSO, FileList, SourceDir, TargetDir, Mess, oSA, WSH, Count

SetMess
Set oSA = CreateObject("Shell.Application")
Set WSH = CreateObject("WScript.Shell")
CheckParam
If MessBox(Mess(10) & vbNewLine & SourceDir & vbNewLine & vbNewLine & _
           Mess(11) & vbNewLine & TargetDir, 4) = vbCancel Then Quit
Count = 0
Set FileList = CreateObject("Scripting.Dictionary")
FillFileList FileList, SourceDir
FilesReplace FileList, TargetDir

MessBox Mess(7) & vbNewLine & vbNewLine & Mess(8) & Count & Mess(9), 3

Quit

Sub CheckParam
  If WScript.Arguments.Count = 0 Then
    MessBox Mess(1), 1
    Quit
  End If
  If WScript.Arguments.Count < 2 Then
    MessBox Mess(2), 1
    Quit
  End If
  SourceDir = WScript.Arguments(0)
  TargetDir = WScript.Arguments(1)
  Set FSO   = CreateObject("Scripting.FileSystemObject")
  If SourceDir = "" Then
    SourceDir = OpenFolder(Mess(5))
  Else
    SourceDir = GetPath(SourceDir)
  End If
  If TargetDir = "" Then
    TargetDir = OpenFolder(Mess(6))
  Else
    TargetDir = GetPath(TargetDir)
  End If
  If Not FSO.FolderExists(SourceDir) Then
    MessBox Mess(3), 1
    Quit
  End If
  If Not FSO.FolderExists(TargetDir) Then
    MessBox Mess(4), 1
    Quit
  End If
End Sub

Sub FillFileList(byRef pFileList, pFolder)
  Dim lF, lFolder
  Set lFolder = FSO.GetFolder(pFolder)
  For Each lF In lFolder.Files
    If Not pFileList.Exists(lF) Then
      pFileList.Add lF.Name, lF.Path
    End If
  Next
  If ViewSubFolders Then
    For Each lF In lFolder.SubFolders
      FillFileList pFileList, lF.Path
    Next
  End If
  Set lFolder = Nothing
End Sub

Sub SetMess
  Set Mess = CreateObject("Scripting.Dictionary")
  Mess.Add 0,  "Замена одноименных файлов"
  Mess.Add 1,  "Не указаны входные параметры!"
  Mess.Add 2,  "Указаны не все входные параметры!"
  Mess.Add 3,  "Исходная папка не существует!"
  Mess.Add 4,  "Целевая папка не существует!"
  Mess.Add 5,  "Укажите исходную папку"
  Mess.Add 6,  "Укажите целевую папку"
  Mess.Add 7,  "Операция завершена."
  Mess.Add 8,  "Заменена произведена для "
  Mess.Add 9,  " файлов."
  Mess.Add 10, "Выполнить замену файлами из папки"
  Mess.Add 11, "файлов в папке"
End Sub

Function MessBox(pMess, pMode)
  Dim lIcon
  Select Case pMode
    Case 1 lIcon = vbCritical    + vbOKOnly
    Case 2 lIcon = vbExclamation + vbOKOnly
    Case 3 lIcon = vbInformation + vbOKOnly
    Case 4 lIcon = vbQuestion    + vbOKCancel
  End Select
  MessBox = MsgBox(pMess, lIcon, Mess(0))
End Function

Sub FilesReplace(pFileList, pFolder)
  Dim lF, lFolder, lAttr
  Set lFolder = FSO.GetFolder(pFolder)
  For Each lF In lFolder.Files
    If pFileList.Exists(lF.Name) Then
      lAttr = lF.Attributes
      lF.Attributes = lF.Attributes And Not 3
      FSO.CopyFile pFileList(lF.Name), lF.Path, True
      Count = Count + 1
      lF.Attributes = lAttr
    End If
  Next
  For Each lF In lFolder.SubFolders
    FilesReplace pFileList, lF.Path
  Next
  Set lFolder = Nothing
End Sub

Function OpenFolder(pTitle)
  Dim oF, lSelect
  Set oF  = oSA.BrowseForFolder(0, pTitle, 16)
  lSelect = Not (TypeName(oF) = "Nothing")
  If lSelect Then
    OpenFolder = oF.Self.Path
  End If
  Set oF  = Nothing
  If Not lSelect Then
    Quit
  End If
End Function

Function GetPath(pPath)
  GetPath = FSO.GetAbsolutePathName(WSH.ExpandEnvironmentStrings(pPath))
End Function

Sub Quit
  Set Mess = Nothing
  Set FSO  = Nothing
  Set oSA  = Nothing
  Set WSH  = Nothing
  WScript.Quit
End Sub

Здесь в скрипте можно по желанию изменить параметр ViewSubFolders, который указывает, брать ли в исходной папке новые файлы в том числе из вложенных подпапок.
_________________
Нет, я не сплю. Я просто медленно моргаю.


Last edited by Batya on Mon Feb 02, 2009 16:19; edited 1 time in total
View user's profile Send private message


Powered by phpBB © 2001, 2005 phpBB Group