PDA

Показать полную графическую версию : скрипт по копирвоанию и последующего удаления файлов по маске названия файла


santey007
15-11-2013, 09:49
день добрый!
задача скрипта такая: есть несколько папок на разных ресурсах. туда делаются скл бэкапы. название бэкапов типа "ххх_backup_2013_08_27_020001_6443075.bak"
нужно что бы со всех этих папок собирались крайние бэкапы в одну папку и через сутки удалялись перед те, как туда будут копироваться новые файлы
ЗЫ с этой папки через синхронизатор какойнить будут забираться эти файлы

подскажите скрипт, в этом не силен вообще

santey007
25-11-2013, 16:35
подскажите плз

Iska
25-11-2013, 18:23
Невнятно изложено техническое задание.

santey007
26-11-2013, 09:25
1-нужно что бы скрипт забирал (копировал) крайний по дате файл из папки с бэкапами в новую папку
2- нужно что бы удалял файл из новой папки в определенное время

+ посоветуйте ПО для синхронизации папок по ФТП

santey007
05-12-2013, 13:35
вообще нет мыслей?

Iska
05-12-2013, 16:46
вообще нет мыслей? »
Есть:
Невнятно изложено техническое задание. »

santey007
06-12-2013, 08:46
да ну что тут непонятного? давайте для начала так: нужно что бы скрипт из одной папки выбирал крайний по дате файл (дата есть и в заголовке файла) и копировал его в другую папку...
наверно еще яснее не смогу объяснить

Iska
06-12-2013, 13:30
@echo off
setlocal enableextensions enabledelayedexpansion

for /f "usebackq delims=" %%i in (
`dir /s /b /a:-d /t:c /o:-d "E:\Песочница\0334\Source\*.bak"`
) do (
>nul copy "%%~i" "E:\Песочница\0334\Destination\"
goto :out
)

:Out

endlocal
exit /b 0

santey007
25-12-2013, 14:22
Iska, вроде бы работает. но батник отрабатывает только тогда, когда папки названы на латинице((( придется все пути переписывать
и второй батник, что бы он например через 36 часов удалял старый файл, оставляя только новый из папки "E:\Песочница\0334\Destination\"
т.е. в папке Destination за 36 часов накопится 2-3 файла, надо что бы он оставил только один, самый новый по дате создания. как реализовать?

Iska
25-12-2013, 14:31
но батник отрабатывает только тогда, когда папки названы на латинице »
Нет.

santey007
25-12-2013, 15:14
еще раз перепроверил: в папке(имя на латинице) лежит один файл name.bak, копирует в папку (названа тоже на латинице) без проблем. но стоит любую папку переименовать на русский... и все, батник не работает. переименовываю назад все, на латиницу-работает.

Iska
25-12-2013, 15:42
Начнём с такого вопроса: в какой кодировке у Вас сохранён пакетный файл?

santey007
25-12-2013, 16:53
изначально был в ANSI
потом в юникод, ютф-8

Iska
25-12-2013, 16:59
изначально был в ANSI
потом в юникод, ютф-8 »
А надо — в OEM/866.

santey007
26-12-2013, 10:13
Iska все здорово, кодировку исправил, копирует нормально, по сети работает тоже хорошо.
теперь второй батник, что бы он например через 36 часов удалял старый файл(наверно можно поставить выполнение батника по времени, например раз в день или два дня), оставляя только самый новый из папки "E:\Песочница\0334\Destination\"
т.е. в папке Destination за 36 часов накопится 2-3 файла, надо что бы он оставил только один, самый новый по дате создания. как реализовать?

Iska
26-12-2013, 14:23
santey007, от какого момента нужно отсчитывать эти 36 часов?

santey007
27-12-2013, 08:42
Iska от момента когда в папке Destination будет более одного файла

santey007
31-12-2013, 09:52
можно хотя бы просто, что бы он удалял все файлы с папки, кроме одного-самого нового. я уж там в задании поставлю время

Iska
06-01-2014, 00:43
я уж там в задании поставлю время »
Где «в задании»? Каким образом задание сможет определить момент:
когда в папке Destination будет более одного файла »

Реализовать можно на WSH:
Option Explicit

Const adDate = 7
Const adVarChar = 200


Dim strSourceFolder

Dim objFSO
Dim objFile

Dim strComputer

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim collSWbemObjectSet
Dim objSWbemObjectEx


strSourceFolder = "E:\Песочница\0334\Destination"

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

If objFSO.FolderExists(strSourceFolder) Then
strComputer = "."

Set objSWbemLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")

Set collSWbemObjectSet = objSWbemServicesEx.ExecNotificationQuery( _
"SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE " &_
"TargetInstance ISA 'CIM_DirectoryContainsFile' AND " &_
"TargetInstance.GroupComponent = 'Win32_Directory.Name=""" & Replace(strSourceFolder, "\", "\\\\") & """'" _
)

Do
Set objSWbemObjectEx = collSWbemObjectSet.NextEvent

If objFSO.GetFolder(strSourceFolder).Files.Count > 1 Then
Exit Do
End If
Loop

WScript.Sleep 1000 * 60 * 60 ' 36 часов

With WScript.CreateObject("ADODB.Recordset")
With .Fields
.Append "Path", adVarChar, 2^15 - 1
.Append "DateCreated", adDate
End With

.Open
.Sort = "DateCreated DESC"

For Each objFile In objFSO.GetFolder(strSourceFolder).Files
.AddNew Array("Path", "DateCreated"), Array(objFile.Path, objFile.DateCreated)
Next

If .RecordCount >= 2 Then
.MoveFirst
.MoveNext

Do Until .EOF
With .Fields
objFSO.DeleteFile .Item("Path").Value, True
End With

.MoveNext
Loop
Else
' Nothing to do
End If

.Close
End With

Set objSWbemObjectEx = Nothing
Set collSWbemObjectSet = Nothing
Set objSWbemServicesEx = Nothing
Set objSWbemLocator = Nothing
Else
WScript.Echo "Source folder [" & strSourceFolder & "] not found."
WScript.Quit 1
End If

Set objFSO = Nothing

WScript.Quit 0

но смысла в подобной организации автоматизации я не вижу ни малейшего.

santey007
22-12-2015, 10:43
подниму темку, ситуация немного изменилась, вернее тех задание. нужно все тоже самое, НО чтоб копировал на фтп
1-копирование крайнего по дате бэкапа скл, маска такая base_backup_2013_08_27_020001_6443075.bak на фтп
2-раз в неделю чистка бэкапов на фтп-ке, т.е. удаляем все, кроме самого крайнего по дате

я понимаю что на wsh легко наверняка подправить, но не силен в этом вообще




© OSzone.net 2001-2012