1

Тема: WSH: Нужен скрипт для копирования файлов

для копирования файлов из одного каталога в другой, с учетом даты создания файла, т.е. если дата меньше указанной то копируем файл. И из вложеных каталогов тоже.

Почему не хочется делать ручками: файлов на ~9 ГБ (каждый файл ~100 КБ), вложенных каталогов около 300 шт.

помогите, пожалуйста

2

Re: WSH: Нужен скрипт для копирования файлов

Правила нарушать изволите? Заголовок темы-то не того...

4.2. Всегда пытайтесь сделать заголовок своего вопроса наиболее информативным. Темы, не отражающие суть сообщения, приравниваются к флуду, например, "ОЧЕНЬ НУЖНА ПОМОЩЬ ПРОФИ!" или "Срочно! Help!".

По теме: WSH-скрипт устроит? И ещё:

4.4. Подробно опишите свою проблему. Ни у кого нет желания вытягивать из Вас эти сведения клещами...

Сформулируй, что должно быть на входе, что на выходе. Операция разовая, или копировать надо постоянно, время от времени? Графический интерфейс нужен, или командной строки хватит? А может, и встроенных средств Total Commander будет достаточно?

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

3

Re: WSH: Нужен скрипт для копирования файлов

The gray Cardinal пишет:

Правила нарушать изволите? Заголовок темы-то не того...

Прошу прощения, больше не буду.

The gray Cardinal пишет:

По теме: WSH-скрипт устроит? И ещё:
Сформулируй, что должно быть на входе, что на выходе. Операция разовая, или копировать надо постоянно, время от времени? Графический интерфейс нужен, или командной строки хватит? А может, и встроенных средств Total Commander будет достаточно?

1) Устроит. На входе папка TARGET (все файлы внутри нее и ее подпапок), на выходе папка TARGET1 (с той же структурой подпапок и файлами у которых дата создания меньше указанной). Т.е. если дата создания файла в папке TARGET\1 < 01.08.2006, то переносим его в папку TARGET1\1 и т.д.
2) Копировать необходимо периодически, раз в неделю.
3) Графический интерфейс желателен , но достаточно будет командной строки.
4) На данном компьютере нет возможности установить Total Commander (там разрешены только скрипты).

4

Re: WSH: Нужен скрипт для копирования файлов

А ведь в Total Commander есть замечательная команда "Команды" - "Синхронизировать каталоги...". И по-моему, если папку с установленным Total Commander просто скопировать на другой комп, он будет работать. И ещё: точно дата создания, а не дата изменения? Т.е. ты фактически хочешь сделать архивную копию устаревших файлов, так получается? TARGET1 уже содержит файлы? Если да, то надо переписывать поверх?

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

5 (изменено: vedun, 2006-08-29 21:50:43)

Re: WSH: Нужен скрипт для копирования файлов

Я бы с удовольствием, но админы не разрешают. Разрешают только скрипт поставить в планировщик.

Да перезапись необходима.

6

Re: WSH: Нужен скрипт для копирования файлов

Другой вариант - расшарить каталог, задав права, и использовать Total Commander с другой машины. И кстати, ты ответил не на все вопросы.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

7

Re: WSH: Нужен скрипт для копирования файлов

Расшарить не получиться по той же причине, админы не позволяют.
Точно - дата создания файла.

8

Re: WSH: Нужен скрипт для копирования файлов

ОК, попробую набросать VB-скрипт.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

9

Re: WSH: Нужен скрипт для копирования файлов

спасибо!

10

Re: WSH: Нужен скрипт для копирования файлов

Пробуй. Если файл, который нужно перезаписать, имеет атрибут read-only, возникнет ошибка. Если у тебя такие файлы есть - говори, поправлю.

InitialFolder = "C:\Job" ' каталог, откуда копируем
TargetFolder = "C:\Temp\Temp" ' каталог, куда копируем
ControlDate = CDate("01.08.2006") ' контрольная дата (копируем файлы с датой создания раньше этой)
'====================================================================
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShellApp = CreateObject("Shell.Application")
CopyFiles InitialFolder

' процедура рекурсивно перебирает файлы в каталоге
Sub CopyFiles(FolderPath)
    Set objFolderItems = objShellApp.NameSpace(FolderPath).Items()
    For Each objFolderItem In objFolderItems
        If objFolderItem.IsFolder And LCase(Right(objFolderItem.Name, 4)) <> ".zip" Then
            CopyFiles objFolderItem.Path
        Else
            Set objFile = objFSO.GetFile(objFolderItem.Path)
            If objFile.DateCreated < ControlDate Then
                CopyFile objFolderItem.Path
            End If
        End If
    Next
End Sub

' процедура копирует файл
Sub CopyFile(FilePath)
    SubPath = Mid(FilePath, Len(InitialFolder) + 1)
    TargetPath = TargetFolder & SubPath
    FolderPath = objFSO.GetParentFolderName(TargetPath)
    If Not objFSO.FolderExists(FolderPath) Then
        CreateFolder FolderPath
    End If
    objFSO.CopyFile FilePath, TargetPath, True
End Sub

' процедура создаёт каталог
Sub CreateFolder (FolderPath)
    ParentFolder = objFSO.GetParentFolderName(FolderPath)
    If Not objFSO.FolderExists(ParentFolder) Then
        CreateFolder ParentFolder
    End If
    objFSO.CreateFolder FolderPath
End Sub
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

11

Re: WSH: Нужен скрипт для копирования файлов

Ок, сейчас попробую !

12

Re: WSH: Нужен скрипт для копирования файлов

Не работает

Странно, но никакой реакции.

13

Re: WSH: Нужен скрипт для копирования файлов

извините, я торможу, все работает

Но все таки есть несколько файлов ReadOnly

14

Re: WSH: Нужен скрипт для копирования файлов

Проверку и снятие ReadOnly - завтра, ОК? А то уже поздновато Кстати, скрипт всё делает "молчком", а тебе, наверное, понадобится лог. Тоже можно приделать потом.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

15

Re: WSH: Нужен скрипт для копирования файлов

Конечно, спасибо !

Да, лог это было бы здорово !!!

16

Re: WSH: Нужен скрипт для копирования файлов

Добавил обработку ошибок, снятие ReadOnly и запись лог-файла. В каталоге скрипта создаётся или дописывается файл CopyLog.log. Пробуй, не стесняйся задавать вопросы.

InitialFolder = "C:\Job" ' каталог, откуда копируем
TargetFolder = "C:\Temp\Temp" ' каталог, куда копируем
ControlDate = CDate("01.08.2006") ' контрольная дата (копируем файлы с датой создания раньше этой)
'====================================================================
On Error Resume Next
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShellApp = CreateObject("Shell.Application")
LogPath = objFSO.GetParentFolderName(WScript.ScriptFullName)
Set LogStream = objFSO.OpenTextFile(LogPath & "\CopyLog.log", 8, True)
LogStream.WriteLine "Начало копирования " & Now()

CopyFiles InitialFolder
LogStream.WriteLine "Конец копирования: " & Now()
LogStream.Close

' процедура рекурсивно перебирает файлы в каталоге
Sub CopyFiles(FolderPath)
    On Error Resume Next
    Set objFolderItems = objShellApp.NameSpace(FolderPath).Items()
    For Each objFolderItem In objFolderItems
        If objFolderItem.IsFolder And LCase(Right(objFolderItem.Name, 4)) <> ".zip" Then
            CopyFiles objFolderItem.Path
        Else
            Set objFile = objFSO.GetFile(objFolderItem.Path)
            If objFile.DateCreated < ControlDate Then
                CopyFile objFolderItem.Path
            End If
        End If
    Next
End Sub

' процедура копирует файл
Sub CopyFile(FilePath)
    On Error Resume Next
    SubPath = Mid(FilePath, Len(InitialFolder) + 1)
    TargetPath = TargetFolder & SubPath
    FolderPath = objFSO.GetParentFolderName(TargetPath)
    If Not objFSO.FolderExists(FolderPath) Then
        CreateFolder FolderPath
    End If
    ' если у файла назначения есть атрибут ReadOnly, снимаем его
    If objFSO.FileExists(TargetPath) Then
        Set objFile = objFSO.GetFile(TargetPath)
        If objFile.Attributes And 1 Then
            objFile.Attributes = objFile.Attributes - 1
        End If
    End If
    objFSO.CopyFile FilePath, TargetPath, True
    If Err.Number <> 0 Then
        LogStream.WriteLine
        LogStream.WriteLine FilePath
        LogStream.WriteLine Err.Description
        LogStream.WriteLine
        Err.Clear
    Else
        LogStream.WriteLine TargetPath
    End If
End Sub

' процедура создаёт каталог
Sub CreateFolder (FolderPath)
    On Error Resume Next
    ParentFolder = objFSO.GetParentFolderName(FolderPath)
    If Not objFSO.FolderExists(ParentFolder) Then
        CreateFolder ParentFolder
    End If
    objFSO.CreateFolder FolderPath
End Sub
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

17

Re: WSH: Нужен скрипт для копирования файлов

Огромное спасибо !!! Все работает !
Вопросы:
1) Как в конце работы скрипта вызвать архиватор ?
2) Где можно почитать о написании этих скриптов (на русском) ???

18

Re: WSH: Нужен скрипт для копирования файлов

vedun пишет:

Где можно почитать о написании этих скриптов (на русском) ???

На этом сайте в принципе, тут же и куча ссылок на разные сайты с интересующей тебя информацией...
Почитай раздел Windows Scripting...

Нет ничего невозможного, для нас невозможное это только то, о чем мы не знаем на данном этапе...

19

Re: WSH: Нужен скрипт для копирования файлов

Санёк пишет:

На этом сайте в принципе, тут же и куча ссылок на разные сайты с интересующей тебя информацией... Почитай раздел Windows Scripting...

Спасибо! Я просто не успел все обойти на этом сайте

20

Re: WSH: Нужен скрипт для копирования файлов

vedun пишет:

Как в конце работы скрипта вызвать архиватор ?

Примерно так:

Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "командная строка вызова архиватора", 0, True

Вставлять это надо после строки скрипта

LogStream.Close
vedun пишет:

Где можно почитать о написании этих скриптов (на русском) ???

Походи по ссылкам вот в этой теме. Скачай вот этот файл справки (он на русском), там много примеров кода.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

21

Re: WSH: Нужен скрипт для копирования файлов

The gray Cardinal пишет:

Примерно так:

Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "командная строка вызова архиватора", 0, True

Вставлять это надо после строки скрипта

LogStream.Close

Спасибо.

The gray Cardinal пишет:

Походи по ссылкам вот в этой теме.

Обязательно пройдусь.

The gray Cardinal пишет:

Скачай вот этот файл справки (он на русском), там много примеров кода.

Уже скачал.

22

Re: WSH: Нужен скрипт для копирования файлов

туплю, как сделать запрос на ввод даты ?

23

Re: WSH: Нужен скрипт для копирования файлов

vedun  пишет:

как сделать запрос на ввод даты ?

Если интерактивно, то InputBox(), наверное. А может стоит просто рассчитать дату от текущей?

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

24

Re: WSH: Нужен скрипт для копирования файлов

The gray Cardinal пишет:
vedun  пишет:

как сделать запрос на ввод даты ?

Если интерактивно, то InputBox(), наверное. А может стоит просто рассчитать дату от текущей?

А может написать для него оболочку на hta с настройками, используя твой скрипт?
Будет прога готовая... )
Что думаешь?

Нет ничего невозможного, для нас невозможное это только то, о чем мы не знаем на данном этапе...

25

Re: WSH: Нужен скрипт для копирования файлов

Санёк пишет:

А может написать для него оболочку на hta с настройками, используя твой скрипт?

Никто не запрещает Однако для создания отдельного приложения задача слишком уж узкая (откопировать файлы заданного каталога по дате создания, меньшей заданной). А если задачу расширить, то придётся писать свой Total Commander . Кроме того, такую задачу логично запускать автоматом по расписанию, а в этом случае графический интерфейс будет лишним.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

26 (изменено: Санёк, 2006-08-31 13:07:54)

Re: WSH: Нужен скрипт для копирования файлов

Ну почему же Total Commander
Можно просто автоматизировать именно эту задачу, тоесть сделать кнопки обзора для папки входа и выхода...
Размер файлов ограничить, время изменения последнее можно календарём выбирать или установить настоящее время, тоесть сейчас, прогу по сути, как я понял, хотят применять для бэкапа данных на каком-нибудь сервере или просто компе... возможно ftp )
vedun, как тебе идея с пользовательским интерфейсом?
Оформить кстати тоже красиво никто не мешает )
Так-же можно функцию автоматического запуска по расписанию замутить, почему бы и нет, и настраивать её тоже! )

У меня сейчас правда времени нет, но через недельку я бы с удовольствием взялся бы за разработку... )

Нет ничего невозможного, для нас невозможное это только то, о чем мы не знаем на данном этапе...

27

Re: WSH: Нужен скрипт для копирования файлов

Санёк пишет:

Можно просто автоматизировать именно эту задачу, тоесть сделать кнопки обзора для папки входа и выхода...

Папка входа и выхода стандартные и не меняются.

Санёк пишет:

vedun, как тебе идея с пользовательским интерфейсом?
Оформить кстати тоже красиво никто не мешает )

Не мешает, но только для конкретной задачи нет смысла.

Санёк пишет:

У меня сейчас правда времени нет, но через недельку я бы с удовольствием взялся бы за разработку... )

Спасибо за предложение.

28

Re: WSH: Нужен скрипт для копирования файлов

Подниму тему!
На сервере существует папка для обмена файлами для пользователей.Нужно удалять файлы которые старше трех дней.В данном примере описывается как обрабатывать файлы старше опред. даты,т.е для моей задачи получается что каждые 3 дня нуно править в скрипте дату.А не подскажите как можно сотворить чтобы скрипт брал сегодняшнюю дату ,и удалял файлы на 3 дня старше.
Плиз подскажите!

29

Re: WSH: Нужен скрипт для копирования файлов

Dronskiy пишет:

Нужно удалять файлы которые старше трех дней.

...

В данном примере описывается как обрабатывать файлы старше опред. даты,т.е для моей задачи получается что каждые 3 дня нуно править в скрипте дату.

Так надо просто удалять файлы? зачем править в скрипте дату то? если моно опираться на текущую?

Нет ничего невозможного, для нас невозможное это только то, о чем мы не знаем на данном этапе...

30 (изменено: Dronskiy, 2007-05-02 14:26:09)

Re: WSH: Нужен скрипт для копирования файлов

Да просто удалять.

Всмысле опираться на текущую?Обьясните пожалуйста как скрипт будет получать сегодняшнюю дату и выбирать файлы старше оной на 3 дня.
Не кидайтесь только камнями если туплю))))

31

Re: WSH: Нужен скрипт для копирования файлов

Dronskiy
Запусти такой vb-скрипт:

WSCript.Echo Now
WSCript.Echo Now - 3
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

32

Re: WSH: Нужен скрипт для копирования файлов

Получаю я им текущую дату,а несколько дальше))))

33

Re: WSH: Нужен скрипт для копирования файлов

Ты хочешь что-бы удалялись просто файлы, а если остаётся скажем пустая папка, то она остаётся, так?

Нет ничего невозможного, для нас невозможное это только то, о чем мы не знаем на данном этапе...

34 (изменено: Санёк, 2007-05-02 15:12:14)

Re: WSH: Нужен скрипт для копирования файлов

В самом начале указывается, насколько старые должны быть файлы, чтобы скрипт удалил их! (Now-3 возвращает дату на 3 суток раньше текущей)
Скрипт написан путём видоизменения скрипта от The gray Cardinal

InitialFolder = "C:\1" ' каталог, откуда удаляем
ControlDate = Now-3 ' контрольная дата (удаляет файлы с датой создания раньше этой)

'====================================================================
On Error Resume Next
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShellApp = CreateObject("Shell.Application")
LogPath = objFSO.GetParentFolderName(WScript.ScriptFullName)
Set LogStream = objFSO.OpenTextFile(LogPath & "\CopyLog.log", 8, True)
LogStream.WriteLine "Начало удаления " & Now()

DelFiles InitialFolder
LogStream.WriteLine "Конец удаления: " & Now()
LogStream.WriteLine
LogStream.Close

' процедура рекурсивно перебирает файлы в каталоге удаляя их
Sub DelFiles(FolderPath)
    On Error Resume Next
    Set objFolderItems = objShellApp.NameSpace(FolderPath).Items()
    For Each objFolderItem In objFolderItems
        If objFolderItem.IsFolder And LCase(Right(objFolderItem.Name, 4)) <> ".zip" Then
            DelFiles objFolderItem.Path
        Else
            Set objFile = objFSO.GetFile(objFolderItem.Path)
            If objFile.DateCreated < ControlDate Then
                LogStream.WriteLine "Был удалён файл: " & objFolderItem.Path
                objFile.Delete true
            End If
        End If
    Next
End Sub
Нет ничего невозможного, для нас невозможное это только то, о чем мы не знаем на данном этапе...

35

Re: WSH: Нужен скрипт для копирования файлов

СПАСИБО ОГРОМНЕЙШЕЕ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

36

Re: WSH: Нужен скрипт для копирования файлов

У меня почти такой же, только трёт ещё и пустые папки. Ведение лога не ведётся. Эксплуатируется достаточно долго. Лежит как задание в планировщике.

Option Explicit

'=======================================================
Sub ClearSubFolders(objFolder)
    Dim objSubFolder
    Dim objFile

    For Each objSubFolder In objFolder.SubFolders
        ClearSubFolders objSubFolder
    Next

    For Each objFile In objFolder.Files
        If DateDiff("d", objFile.DateCreated, Now()) > 3 Then
            objFile.Delete(True)
        End If
    Next

    If (objFolder.Files.Count = 0) And (objFolder.SubFolders.Count = 0) Then
        If objFolder.Path = strPathToClear Then
        Else
            objFolder.Delete(True)
        End If
    End If
End Sub
'=======================================================

Dim objWshShell

Dim objFS
Dim objFolder

Const strPathToClear = "E:\Для обмена"

Set objFS = WScript.CreateObject("Scripting.FileSystemObject")

ClearSubFolders objFS.GetFolder(strPathToClear)

37

Re: WSH: Нужен скрипт для копирования файлов

Поскольку постоянно спрашивают, я дополнил пример в коллекции "простым" копированием без условий и подпапок.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

38

Re: WSH: Нужен скрипт для копирования файлов

Здравствуйте!

Аналогичная задача, только надо не скопировать а переместить файлы старше определенной даты.
Какую функцию поставить?
А то в скриптах не силен

Спасибо большое

39

Re: WSH: Нужен скрипт для копирования файлов

Еще забыл, подскажите как сделать чтобы он перемещал файлы старше месяца (отсчет от текущей даты)

40

Re: WSH: Нужен скрипт для копирования файлов

lexx пишет:

Аналогичная задача, только надо не скопировать а переместить файлы старше определенной даты.
Какую функцию поставить?

Вместо CopyFile подставить MoveFile. Синтаксис вызова - см. в файле http://www.script-coding.com/wsh_chm.zip.

lexx пишет:

как сделать чтобы он перемещал файлы старше месяца (отсчет от текущей даты)

Запусти вот это:

WScript.Echo Now
WScript.Echo Now - 30
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

41

Re: WSH: Нужен скрипт для копирования файлов

Здравствуйте всем!

Есть такая задача: существует папка, в которой сложены файлы вида XXXXX-YY-ZZ, т.е. 12345-01-01, 12345-01-02, 12345-02-01, 12345-02-02 и т.д.
Необходим скрипт, который бы во вложенной папке "Архив" создавал подпапку XXXXX (первые пять символов имени файла) и все файлы старше 5 дней (дата создания), содержащие эти символы в начале своего имени, перемещал в соответствующую папку. Сколько ни пробовал, ничего толком не получается.

У кого какие идеи?

42

Re: WSH: Нужен скрипт для копирования файлов

Примерно так:

Option Explicit

Public objFSO
Dim objArchiveFolder
Dim objFile

Dim strWorkFolder
Dim strArchiveFolder

Set objFSO = CreateObject("Scripting.FileSystemObject")

strWorkFolder = "c:\Temp\001"
strArchiveFolder = strWorkFolder & "\Архив"

If Not objFSO.FolderExists(strArchiveFolder) Then
    objFSO.CreateFolder strArchiveFolder
End If

Set objArchiveFolder = objFSO.GetFolder(strArchiveFolder)

For Each objFile In objFSO.GetFolder(strWorkFolder).Files
    If Age(objFile) > 5 Then
        MoveFileToArchive objFile, objArchiveFolder
    End If
Next

WScript.Quit(0)

'=======================================================================
Function Age(objFile)
    Age = DateDiff("d", objFile.DateCreated, Now())
End Function
'=======================================================================

'=======================================================================
Sub MoveFileToArchive(objFile, objArchiveFolder)
    Dim strSubFolderToMove

    strSubFolderToMove = objArchiveFolder.Path & "\" & Left(objFile.Name, 5)
    
    If Not objFSO.FolderExists(strSubFolderToMove) Then
        objFSO.CreateFolder strSubFolderToMove
    End If

    objFile.Move strSubFolderToMove & "\" & objFile.Name
End Sub
'=======================================================================

Проверяйте сначала обязательно на копии

43 (изменено: CAIIIOK, 2007-08-05 17:27:47)

Re: WSH: Нужен скрипт для копирования файлов

alexii, спасибо большое!

Вот, немного домучал, прикрутил лог и проверку на ошибки (спасибо The gray Cardinal за скрипт на предыдущей странице):

Option Explicit

Public objFSO
Dim objArchiveFolder
Dim objFile

Dim strWorkFolder
Dim strArchiveFolder
Dim LogStream
Dim LogPath 
Dim objShellApp

set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShellApp = CreateObject("Shell.Application")

strWorkFolder = "D:\Test"
strArchiveFolder = strWorkFolder & "\Архив"
LogPath = strArchiveFolder

set LogStream = objFSO.OpenTextFile(LogPath & "\MoveLog.log", 8, True)

LogStream.WriteLine
LogStream.WriteLine "--- Начало работы " & Now() & " ---"

If Not objFSO.FolderExists(strArchiveFolder) Then
    objFSO.CreateFolder strArchiveFolder
    LogStream.WriteLine "Создана папка " & strArchiveFolder
    
End If

Set objArchiveFolder = objFSO.GetFolder(strArchiveFolder)

For Each objFile In objFSO.GetFolder(strWorkFolder).Files
    If Age(objFile) > 5 Then
        MoveFileToArchive objFile, objArchiveFolder
    End If
Next

LogStream.WriteLine
LogStream.WriteLine "--- Окончание работы " & Now() & " ---"

WScript.Quit(0)

'=======================================================================
Function Age(objFile)
    Age = DateDiff("d", objFile.DateCreated, Now())
End Function
'=======================================================================

'=======================================================================
Sub MoveFileToArchive(objFile, objArchiveFolder)
    
    On Error Resume Next

    Dim strSubFolderToMove

    strSubFolderToMove = objArchiveFolder.Path & "\" & Left(objFile.Name, 5)
    
    If Not objFSO.FolderExists(strSubFolderToMove) Then
        objFSO.CreateFolder strSubFolderToMove
        LogStream.WriteLine
        LogStream.WriteLine "Создана папка " & strSubFolderToMove
    
    
    End If

    objFile.Move strSubFolderToMove & "\" & objFile.Name

    If Err.Number <> 0 Then
        
        LogStream.WriteLine "Ошибка перемещения файла " & strWorkFolder & "\" & objFile.Name & " - " & Err.Description
        Err.Clear

    Else

        LogStream.WriteLine "Файл " & objFile.Name & " перемещен в " & strSubFolderToMove & "\" & objFile.Name


    End If
    
    
End Sub
'=======================================================================

Сильно не ругайте - делаю это в первый раз.

Еще вопрос: как сделать проверку на соотвествие имени файла формату XXXXX-YY-ZZ (т.е. первые пять символов имени - цифры, шестой - "-", и  если не соответствует - не перемещать?

Заранее спасибо.

44

Re: WSH: Нужен скрипт для копирования файлов

CAIIIOK пишет:

...как сделать проверку на соотвествие имени файла формату XXXXX-YY-ZZ (т.е. первые пять символов имени - цифры, шестой - "-", и  если не соответствует - не перемещать?

Регулярными выражениями.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

45

Re: WSH: Нужен скрипт для копирования файлов

Я пробовал так:

...
Dim objRegExp 
...
Set objRegExp = New RegExp
objRegExp.IgnoreCase = True
objRegExp.Global = False
' Только десятичные символы в имени; иначе 
' использовать [.{5}-.{2}-.{2}\..*] для любых символов в имени.
objRegExp.Pattern = "\d{5}-\d{2}-\d{2}\..*"
...
For Each objFile In objFSO.GetFolder(strWorkFolder).Files
    If objRegExp.Test(objFile.Name) Then
        If Age(objFile) > 5 Then
            MoveFileToArchive objFile, objArchiveFolder
        End If
    End If
Next
...

46

Re: WSH: Нужен скрипт для копирования файлов

The gray Cardinal пишет:

Регулярными выражениями.

Спасибо.

alexii пишет:
...
objRegExp.Pattern = "\d{5}-\d{2}-\d{2}\..*"
...

До подобного кода я уже дошел, а вот с паттерном есть определенные сложности: и в случае, когда переменная objFile.Name равна "12345-01-01.xls", и когда это же переменная равна "Копия 12345-01-01.xls", результат  одинаков - objRegExp.Test(objFile.Name) - истина. Наглядно демонстрируется вот этим:

Set objRegExp = CreateObject("VBScript.RegExp")
objRegExp.Global = False
objRegExp.Pattern = "\d{5}-\d{2}-\d{2}\..*"
Str = "12345-01-01.xls"
MsgBox objRegExp.Test(Str)
Str = "Копия 12345-01-01.xls"
MsgBox objRegExp.Test(Str)

Другой вариант паттерна мне в готову не пришел...

47 (изменено: alexii, 2007-08-09 08:38:25)

Re: WSH: Нужен скрипт для копирования файлов

Регулярные выражения — очень мощная вещь, при правильном подходе . Мой, как обычно, оказался недостаточно проверенным.

Попробуйте такой вариант шаблона (на основе Вашего примера):

Set objRegExp = CreateObject("VBScript.RegExp")
objRegExp.Global = False
objRegExp.Pattern = "^\d{5}-\d{2}-\d{2}\..{0,4}$"
Str = "12345-01-01.xls"
MsgBox objRegExp.Test(Str), 0 ,Str
Str = "Копия 12345-01-01.xls"
MsgBox objRegExp.Test(Str), 0 ,Str
Str = "12345-01-01.Копия.xls"
MsgBox objRegExp.Test(Str), 0 ,Str
Str = "12345-01-01.Коп.xls"
MsgBox objRegExp.Test(Str), 0 ,Str
Str = "12345-01-01."
MsgBox objRegExp.Test(Str), 0 ,Str

{0,4} — ну, если вдруг *.html, что-ли. Хотя, если у Вас только *.xls, то можно так и написать.

P.S. Да, кстати, "12345-01-01." в примере отрабатывает, но в скрипте-то objFile.Name вернёт только "12345-01-01", т.е. без точки; так что, пожалуй, даже

...
objRegExp.Pattern = "^\d{5}-\d{2}-\d{2}(|\..{1,4})$"
...
Str = "12345-01-01."
MsgBox objRegExp.Test(Str), 0 ,Str 'Должно быть Ложь
Str = "12345-01-01"
MsgBox objRegExp.Test(Str), 0 ,Str 'Должно быть Истина

48

Re: WSH: Нужен скрипт для копирования файлов

alexii пишет:

Попробуйте такой вариант шаблона...

alexii, с Вашей помошью разобрался я с паттернами :-)

Немного еще покрутил предложенный Вами вариант, и получилось то, что нужно. Работает все замечательно.

Еще раз спасибо.

49

Re: WSH: Нужен скрипт для копирования файлов

Выложите Ваш вариант шаблона, мне тоже интересно.

50

Re: WSH: Нужен скрипт для копирования файлов

Санёк пишет:

В самом начале указывается, насколько старые должны быть файлы, чтобы скрипт удалил их! (Now-3 возвращает дату на 3 суток раньше текущей)
Скрипт написан путём видоизменения скрипта от The gray Cardinal

InitialFolder = "C:\1" ' каталог, откуда удаляем
ControlDate = Now-3 ' контрольная дата (удаляет файлы с датой создания раньше этой)

'====================================================================
On Error Resume Next
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShellApp = CreateObject("Shell.Application")
LogPath = objFSO.GetParentFolderName(WScript.ScriptFullName)
Set LogStream = objFSO.OpenTextFile(LogPath & "\CopyLog.log", 8, True)
LogStream.WriteLine "Начало удаления " & Now()

DelFiles InitialFolder
LogStream.WriteLine "Конец удаления: " & Now()
LogStream.WriteLine
LogStream.Close

' процедура рекурсивно перебирает файлы в каталоге удаляя их
Sub DelFiles(FolderPath)
    On Error Resume Next
    Set objFolderItems = objShellApp.NameSpace(FolderPath).Items()
    For Each objFolderItem In objFolderItems
        If objFolderItem.IsFolder And LCase(Right(objFolderItem.Name, 4)) <> ".zip" Then
            DelFiles objFolderItem.Path
        Else
            Set objFile = objFSO.GetFile(objFolderItem.Path)
            If objFile.DateCreated < ControlDate Then
                LogStream.WriteLine "Был удалён файл: " & objFolderItem.Path
                objFile.Delete true
            End If
        End If
    Next
End Sub

Прива Санчел, что то ControlDate = Now-3 ' контрольная дата (удаляет файлы с датой создания раньше этой) не работит, правильно  я понимаю что Now -3 удаляет на три дня до текущей даты
у меня этот скрипт затирает вообще все файлы в папке не  смотря на разные даты файлов, включая файлы на текущую дату... в чем загвоздка, помогите! может у меня нет каких нить патчей на VBS и поэтому не понимает синтаксис скрипта???

51

Re: WSH: Нужен скрипт для копирования файлов

Здравствуйте всем! В программировании не силен.
Помогите со скриптом в этой ветке.
Задача заключается в том, чтобы из папки1(со своей иерархией) прошерстить все файлы и переместить те, которые НЕ ИЗМЕНЯЛИСЬ и НЕ ОТКРЫВАЛИСЬ больше чем заданное время (например год) в папку2 с иерархией папки1.