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 

автоматическое удаление файлов по датам создания
Goto page Previous  1, 2
 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Volniy



Joined: 15 Dec 2004
Posts: 585
Location: Местный

Post (Separately) Posted: Wed Jun 10, 2009 21:30    Post subject: Reply with quote

Параметр кнопки %L нужно написать в кавычках, "%L", именно так, как в шапке скрипта.
Back to top
View user's profile Send private message
Neo233



Joined: 09 Jun 2009
Posts: 29

Post (Separately) Posted: Wed Jun 10, 2009 21:37    Post subject: Reply with quote

Volniy wrote:
Параметр кнопки %L нужно написать в кавычках, "%L", именно так, как в шапке скрипта.

Применил. Всё равно выскакивает вышеупомянутое окно с сообщением об ошибке. Текст сообщения тот же что и раньше..


Last edited by Neo233 on Thu Jun 11, 2009 17:48; edited 1 time in total
Back to top
View user's profile Send private message
Volniy



Joined: 15 Dec 2004
Posts: 585
Location: Местный

Post (Separately) Posted: Thu Jun 11, 2009 00:16    Post subject: Reply with quote

Странные дела... А что именно у тебя находится в 15-ой строке vbs-файла?
Кроме того, может стоит попробовать установить последнюю версию WSH?
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Thu Jun 11, 2009 15:21    Post subject: Reply with quote

Neo233
vbs-скрипт:
Code:
'=======================================================================================
' Удаление из указанной папки файлов-дубликатов, кроме самого раннего по времени.
'   Дубликатами считаются файлы, у которых совпадает CRC32.

' Параметр скрипта - обрабатываемая папка

' Для работы скрипта необходимо зарегистрировать в системе компонент DynamicWrapperX
'=======================================================================================
Option Explicit

Dim WRP, FSO, WSH, Mess, Folder, FCrc
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WSH = CreateObject("WScript.Shell")
Set WRP = CreateObject("DynamicWrapperX")
WRP.Register "ImageHlp.DLL", "MapFileAndCheckSum", "i=sUU", "r=u"

MessDefine
CheckParams

Set FCrc = CreateObject("Scripting.Dictionary")
Main Folder
MsgBox Mess(3), vbInformation + vbOKOnly, Mess(0)
Quit

'===== Процедуры и функции ===============================================================
Sub Main(pFolder)
  Dim FF, F, FC, Crc
  Set FF = FSO.GetFolder(pFolder)
  For Each F In FF.SubFolders
    Main(F)
  Next
  For Each F In FF.Files
    Crc = GetCrc(F.Path)
    If FCrc.Exists(Crc) Then
      Set FC = FSO.GetFile(FCrc(Crc))
      If F.DateLastModified < FC.DateLastModified Then
        FCrc(Crc) = F.Path
        DoProc FC.Path
      Else
        DoProc F.Path
      End If
    Else
      FCrc.Add Crc, F
    End If
  Next
End Sub

'Проверка входных параметров
Sub CheckParams
  With WScript
    If .Arguments.Count = 0 Then
      MsgBox Mess(1), vbCritical + vbOKOnly, Mess(0)
      Quit
    End If
    Folder = GetPath(.Arguments(0))
    If Not FSO.FolderExists(Folder) Then
      MsgBox Mess(2), vbCritical + vbOKOnly, Mess(0)
      Quit
    End If
  End With
End Sub

'Основное действие над файлами
Sub DoProc(pPath)
  FSO.DeleteFile pPath
End Sub

'Подсчет контрольной суммы файла
Function GetCrc(pPath)
  Dim lRess, lsHeader, lsCalcd
  lsHeader = 0: lsCalcd = 0
  lRess = WRP.MapFileAndCheckSum(pPath, lsHeader, lsCalcd)
  GetCrc = lsCalcd
End Function

'Путь
Function GetPath(pPath)
  GetPath = FSO.GetAbsolutePathName(WSH.ExpandEnvironmentStrings(pPath))
End Function

'Описание сообщений
Sub MessDefine
  Set Mess = CreateObject("Scripting.Dictionary")
  With Mess
    .Add 0,  "Удаление старых файлов-дубликатов"
    .Add 1,  "Не указаны параметры!"
    .Add 2,  "Указанная папка не существует!"
    .Add 3,  "Операция завершена."
  End With
End Sub

'Выход
Sub Quit
  Set Mess = Nothing
  Set FCrc = Nothing
  Set WRP  = Nothing
  Set WSH  = Nothing
  Set FSO  = Nothing
  WScript.Quit
End Sub

Для работы скрипта необходим DynamicWrapperX.

Кроме того, хотелось бы узнать следующее - Уникальность crc32 для файлов.
_________________
Нет, я не сплю. Я просто медленно моргаю.


Last edited by Batya on Tue Jun 23, 2009 10:54; edited 2 times in total
Back to top
View user's profile Send private message
Neo233



Joined: 09 Jun 2009
Posts: 29

Post (Separately) Posted: Thu Jun 11, 2009 17:38    Post subject: Reply with quote

Volniy wrote:
А что именно у тебя находится в 15-ой строке vbs-файла?

Текст скрипта взял, который вы мне и посоветовали на первой странице дискуссии:
Volniy wrote:
Вахмурка, ты немного не туда указал. Надо бы вот сюда.
Можете глянуть на 15-ю строку.. Я не знаю, как ведётся нумерация строк и с какой позиции..
Volniy wrote:
может стоит попробовать установить последнюю версию WSH?

Не ставится.. Sad
"Эта копия системы Windows не прошла проверку подлинности.
Установленный на компьютере ключ многократной установки заблокирован."

Нашёл поиском и скачал отсюда http://www.freesoft.ru/?id=79897 файл Wsh.dll размером 15520 Байт с такими данными (F3 в ТС показало):

Version language : Английский (США)
CompanyName : Microsoft Corp
FileDescription : OC Setup for WSH
FileVersion : 5.0.1104
InternalName : WSHOC
LegalCopyright : Copyright © 1996-1997 by Microsoft Corp.
OriginalFilename: WSH.dll
ProductName : Component Setup for Microsoft Windows Scripting Host
ProductVersion : 5.0.1104
Creation Date : 11/06/2009 17:16:39
Last Modif. Date: 23/01/2004 03:58:14
Last Access Date: 11/06/2009 00:00:00
FileSize : 15520 bytes ( 15.156 KB, 0.015 MB )
FileVersionInfoSize : 1660 bytes
File type : Dynamic Link Library (0x2)
Target OS : Win32 API (Windows NT) (0x40004)
File/Product version : 5.0.1104.1 / 5.0.1104.1
Language : Английский (США) (0x409)
Character Set : 1200 (ANSI - Unicode (BMP of ISO 10646)) (0x4B0)


Это то, что нужно? Поместил WSH.DLL в C:\Windows\.. директорию. Снова попробовал.. Снова то же самое.. Те же ошибки выскакивают
Batya wrote:
Кроме того, хотелось бы узнать следующее - Уникальность crc32 для файлов

Если ТС находил одинаковые файлы, то они ВСЕГДА были одинаковыми. Я раньше всегда просматривал их вручную перед удалением, затем перестал.

Batya wrote:
Для работы скрипта необходим DynamicWrapperX.
Скачал, поместил в С:\Windows\ Пробовал и с предыдущим скриптом, и с тем, что вы написали в сообщении в 14:21.
С последним скриптом выскакивает ошибка:

Windows Script Host

Сценарий: H:\TC_WS_Help\111.vbs
Строка: 13
Символ: 1
Ошибка: Невозможно создание объекта контейнером ActiveX: `DynamicWrapperX`
Код: 800A01AD
Источник: Ошибка выполнения Microsoft VBScript
[ OK ]


Что ещё может быть?
Back to top
View user's profile Send private message
Volniy



Joined: 15 Dec 2004
Posts: 585
Location: Местный

Post (Separately) Posted: Thu Jun 11, 2009 18:44    Post subject: Reply with quote

Neo233 wrote:
Не ставится..

http://download.microsoft.com/download/a/3/6/a36fd52f-ad38-4fd2-bd2c-5b6c2dc94654/WindowsXP-Windows2000-Script56-KB917344-x86-rus.exe

И оставь в покое WSH.dll Laughing

BTW В vbs скриптах нумерация ведется с начала (а как еще?). Просто я точно не знаю что именно ты скопировал в этот файл, а что нет. Неужто трудно было посчитать до 15-ти?
Back to top
View user's profile Send private message
Neo233



Joined: 09 Jun 2009
Posts: 29

Post (Separately) Posted: Thu Jun 11, 2009 20:43    Post subject: Reply with quote

Ура! Razz Заработала кнопка , наконец! Скачал, установил WindowsXP-Windows2000-Script56-KB917344-x86-rus.exe Перерегистрировал DynamicWrapperX (теперь без ошибок). И сделал новую кнопку. Вписал в параметр путь к папке. Выходит, из-за WSH не работало...
Batya, Volniy, Вахмурка, Tol!k большущее спасибо за скрипт и за разъяснения! Smile
Volniy wrote:
В vbs скриптах нумерация ведется с начала (а как еще?). Просто я точно не знаю что именно ты скопировал в этот файл, а что нет. Неужто трудно было посчитать до 15-ти?

Я имел в виду: может нумерация ведётся начиная с исполняемой части кода, а не со строк комментариев. И к тому же слышал что иногда нумеровка начинается с 0, а не с 1.. Поэтому пальцем в небо не стал тыкать, а честно написал что не знаю Smile
Batya, к вам просьба..
Можете изменить скрипт, чтобы оставался ПЕРВЫЙ из одинаковых в группе файлов? Я это с самого начала ветки написал. Web-камера иногда зависает (по независящим от меня причинам) и выдаёт в Сеть одну и ту же картинку, не обновляясь. При этом из группы одинаковых имеет смысл оставлять только первую картинку. С самой РАННЕЙ датой и временем создания. (нужна информация о том, что происходило в поле зрения Web-камеры). А выходит , что остаётся только последняя. ( Удаляются файлы с первого по предпоследний). Так же выделяет и DupSelector. Только не удаляет.
Попробовал переписать 57-ю строку скрипта
Code:
  FSO.DeleteFile pPath
на другие варианты, но тогда ничего вообще не работает Confused
где бы почитать про команды скриптов?
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Thu Jun 11, 2009 23:31    Post subject: Reply with quote

Neo233 wrote:
Batya, к вам просьба..
... оставлять только первую картинку. С самой РАННЕЙ датой и временем создания.

Исправил скрипт. Конкретно нужно поменять в строке
Code:
If F.DateLastModified > FC.DateLastModified Then
символ "больше" на "меньше":
Code:
If F.DateLastModified < FC.DateLastModified Then


Neo233 wrote:
Если ТС находил одинаковые файлы, то они ВСЕГДА были одинаковыми.
Вопрос не в том, одинаковы ли crc32 для идентичных файлов, а могут ли совпадать crc32 для разных файлов.
После выходных переделаю скрипт на сравнение не по crc32, а по md5.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Neo233



Joined: 09 Jun 2009
Posts: 29

Post (Separately) Posted: Fri Jun 12, 2009 11:55    Post subject: Reply with quote

Batya спасиибооо!!!! Very Happy Very Happy Цены вам нет! Эх, как жить-то хорошо стало!!! Smile И всем, откликнувшимся ещё раз огромный РЕСПЕКТ!!
Batya wrote:
Вопрос не в том, одинаковы ли crc32 для идентичных файлов, а могут ли совпадать crc32 для разных файлов.
После выходных переделаю скрипт на сравнение не по crc32, а по md5.
Я понял. Это и имел в виду. Пока что не встречалось, чтобы при одинаковых CRC32 было разное внутреннее содержимое.
А что, MD5 алгоритм надёжнее? Кстати, в P2P-клиенте Strong DC++ контрольные суммы вычисляются по алгоритму TTH, а не по CRC-32. Это тоже потому, что он вернее?
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Tue Jun 23, 2009 11:04    Post subject: Reply with quote

Реализована проверка идентичности по md5:
Code:
'=====================================================================================
' Удаление из указанной папки файлов-дубликатов, кроме самого раннего по времени.
'   Дубликатами считаются файлы, у которых совпадает MD5.

' Параметр скрипта - обрабатываемая папка

' Для работы скрипта необходимо зарегистрировать в системе компонент XStandard.Buffer
'=====================================================================================
Option Explicit

Dim XSB, FSO, WSH, Mess, Folder, FCrc
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WSH = CreateObject("WScript.Shell")
Set XSB = CreateObject("XStandard.Buffer")

MessDefine
CheckParams

Set FCrc = CreateObject("Scripting.Dictionary")
Main Folder
MsgBox Mess(3), vbInformation + vbOKOnly, Mess(0)

Quit

'===== Процедуры и функции ===========================================================
Sub Main(pFolder)
  Dim FF, F, FC, Crc
  Set FF = FSO.GetFolder(pFolder)
  For Each F In FF.SubFolders
    Main(F)
  Next
  For Each F In FF.Files
    Crc = GetCrc(F.Path)
    If FCrc.Exists(Crc) Then
      Set FC = FSO.GetFile(FCrc(Crc))
      If F.DateLastModified < FC.DateLastModified Then
        FCrc(Crc) = F.Path
        DoProc FC.Path
      Else
        DoProc F.Path
      End If
    Else
      FCrc.Add Crc, F
    End If
  Next
End Sub

'Проверка входных параметров
Sub CheckParams
  With WScript
    If .Arguments.Count = 0 Then
      MsgBox Mess(1), vbCritical + vbOKOnly, Mess(0)
      Quit
    End If
    Folder = GetPath(.Arguments(0))
    If Not FSO.FolderExists(Folder) Then
      MsgBox Mess(2), vbCritical + vbOKOnly, Mess(0)
      Quit
    End If
  End With
End Sub

'Основное действие над файлами
Sub DoProc(pPath)
  FSO.DeleteFile pPath
End Sub

'Подсчет контрольной суммы файла
Function GetCrc(pPath)
  XSB.Load pPath
  GetCrc = XSB.MD5
  XSB.Reset
End Function

'Путь
Function GetPath(pPath)
  GetPath = FSO.GetAbsolutePathName(WSH.ExpandEnvironmentStrings(pPath))
End Function

'Описание сообщений
Sub MessDefine
  Set Mess = CreateObject("Scripting.Dictionary")
  With Mess
    .Add 0,  "Удаление старых файлов-дубликатов"
    .Add 1,  "Не указаны параметры!"
    .Add 2,  "Указанная папка не существует!"
    .Add 3,  "Операция завершена."
  End With
End Sub

'Выход
Sub Quit
  Set Mess = Nothing
  Set FCrc = Nothing
  Set XSB  = Nothing
  Set WSH  = Nothing
  Set FSO  = Nothing
  WScript.Quit
End Sub

Для работы скрипта необходим XStandard.Buffer. Скачать компонент можно здесь (ссылка для скачивания высылается на e-mail). Дистрибутив (архив) имеет размер чуть более 35 Кб.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Neo233



Joined: 09 Jun 2009
Posts: 29

Post (Separately) Posted: Wed Jun 24, 2009 08:42    Post subject: Reply with quote

Batya Спасибо и за md5. А имеет смысл проверять обеими алгоритмами? (crc32 и md5) Или лучше по md5 ?
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Wed Jun 24, 2009 09:30    Post subject: Reply with quote

Neo233 wrote:
А имеет смысл проверять обеими алгоритмами?

Пользуйся, чем тебе удобней и быстрее. Главное - чтобы ложных удалений не было.
А с CRC32 неувязочка вышла - первый скрипт считает, вроде, вовсе не CRC32, а некую недокументированную контрольную сумму.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Neo233



Joined: 09 Jun 2009
Posts: 29

Post (Separately) Posted: Wed Jun 24, 2009 09:34    Post subject: Reply with quote

хм.. так что, тот скрипт выходит применять нельзя?
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Wed Jun 24, 2009 09:36    Post subject: Reply with quote

Neo233 wrote:
хм.. так что, тот скрипт выходит применять нельзя?
Применяй, если он у тебя нормально работает (без ложных удалений). Хотя, для верности лучше поменять на md5.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Mite



Joined: 26 Oct 2009
Posts: 10

Post (Separately) Posted: Wed Oct 28, 2009 11:01    Post subject: Reply with quote

Batya, а почему вы использовали XStandard.Buffer, а не MD5 Checksum Component с того же сайта? Второй как бы более конкретно заточен на подсчет MD5?
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Goto page Previous  1, 2
Page 2 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group