скрипт по копирвоанию и последующего удаления файлов по маске названия файла
день добрый!
задача скрипта такая: есть несколько папок на разных ресурсах. туда делаются скл бэкапы. название бэкапов типа "ххх_backup_2013_08_27_020001_6443075.bak"
нужно что бы со всех этих папок собирались крайние бэкапы в одну папку и через сутки удалялись перед те, как туда будут копироваться новые файлы
ЗЫ с этой папки через синхронизатор какойнить будут забираться эти файлы
подскажите скрипт, в этом не силен вообще
|
Невнятно изложено техническое задание.
|
1-нужно что бы скрипт забирал (копировал) крайний по дате файл из папки с бэкапами в новую папку
2- нужно что бы удалял файл из новой папки в определенное время
+ посоветуйте ПО для синхронизации папок по ФТП
|
Есть:
Цитата:
Цитата Iska
Невнятно изложено техническое задание. »
|
|
да ну что тут непонятного? давайте для начала так: нужно что бы скрипт из одной папки выбирал крайний по дате файл (дата есть и в заголовке файла) и копировал его в другую папку...
наверно еще яснее не смогу объяснить
|
Код:
@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
|
Iska, вроде бы работает. но батник отрабатывает только тогда, когда папки названы на латинице((( придется все пути переписывать
и второй батник, что бы он например через 36 часов удалял старый файл, оставляя только новый из папки "E:\Песочница\0334\Destination\"
т.е. в папке Destination за 36 часов накопится 2-3 файла, надо что бы он оставил только один, самый новый по дате создания. как реализовать?
|
Цитата:
Цитата santey007
но батник отрабатывает только тогда, когда папки названы на латинице »
|
Нет.
|
еще раз перепроверил: в папке(имя на латинице) лежит один файл name.bak, копирует в папку (названа тоже на латинице) без проблем. но стоит любую папку переименовать на русский... и все, батник не работает. переименовываю назад все, на латиницу-работает.
|
Начнём с такого вопроса: в какой кодировке у Вас сохранён пакетный файл?
|
изначально был в ANSI
потом в юникод, ютф-8
|
Цитата:
Цитата santey007
изначально был в ANSI
потом в юникод, ютф-8 »
|
А надо — в OEM/866.
|
Iska все здорово, кодировку исправил, копирует нормально, по сети работает тоже хорошо.
теперь второй батник, что бы он например через 36 часов удалял старый файл(наверно можно поставить выполнение батника по времени, например раз в день или два дня), оставляя только самый новый из папки "E:\Песочница\0334\Destination\"
т.е. в папке Destination за 36 часов накопится 2-3 файла, надо что бы он оставил только один, самый новый по дате создания. как реализовать?
|
santey007, от какого момента нужно отсчитывать эти 36 часов?
|
Iska от момента когда в папке Destination будет более одного файла
|
можно хотя бы просто, что бы он удалял все файлы с папки, кроме одного-самого нового. я уж там в задании поставлю время
|
Цитата:
Цитата santey007
я уж там в задании поставлю время »
|
Где «в задании»? Каким образом задание сможет определить момент:
Цитата:
Цитата santey007
когда в папке 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
но смысла в подобной организации автоматизации я не вижу ни малейшего.
|
подниму темку, ситуация немного изменилась, вернее тех задание. нужно все тоже самое, НО чтоб копировал на фтп
1-копирование крайнего по дате бэкапа скл, маска такая base_backup_2013_08_27_020001_6443075.bak на фтп
2-раз в неделю чистка бэкапов на фтп-ке, т.е. удаляем все, кроме самого крайнего по дате
я понимаю что на wsh легко наверняка подправить, но не силен в этом вообще
|
Время: 18:53.
© OSzone.net 2001-2025