Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   скрипт по копирвоанию и последующего удаления файлов по маске названия файла (http://forum.oszone.net/showthread.php?t=272097)

santey007 15-11-2013 09:49 2255012

скрипт по копирвоанию и последующего удаления файлов по маске названия файла
 
день добрый!
задача скрипта такая: есть несколько папок на разных ресурсах. туда делаются скл бэкапы. название бэкапов типа "ххх_backup_2013_08_27_020001_6443075.bak"
нужно что бы со всех этих папок собирались крайние бэкапы в одну папку и через сутки удалялись перед те, как туда будут копироваться новые файлы
ЗЫ с этой папки через синхронизатор какойнить будут забираться эти файлы

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

santey007 25-11-2013 16:35 2261408

подскажите плз

Iska 25-11-2013 18:23 2261462

Невнятно изложено техническое задание.

santey007 26-11-2013 09:25 2261719

1-нужно что бы скрипт забирал (копировал) крайний по дате файл из папки с бэкапами в новую папку
2- нужно что бы удалял файл из новой папки в определенное время

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

santey007 05-12-2013 13:35 2267371

вообще нет мыслей?

Iska 05-12-2013 16:46 2267497

Цитата:

Цитата santey007
вообще нет мыслей? »

Есть:
Цитата:

Цитата Iska
Невнятно изложено техническое задание. »


santey007 06-12-2013 08:46 2267856

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

Iska 06-12-2013 13:30 2267974

Код:

@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 2278321

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

Iska 25-12-2013 14:31 2278323

Цитата:

Цитата santey007
но батник отрабатывает только тогда, когда папки названы на латинице »

Нет.

santey007 25-12-2013 15:14 2278343

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

Iska 25-12-2013 15:42 2278360

Начнём с такого вопроса: в какой кодировке у Вас сохранён пакетный файл?

santey007 25-12-2013 16:53 2278395

изначально был в ANSI
потом в юникод, ютф-8

Iska 25-12-2013 16:59 2278398

Цитата:

Цитата santey007
изначально был в ANSI
потом в юникод, ютф-8 »

А надо — в OEM/866.

santey007 26-12-2013 10:13 2278720

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

Iska 26-12-2013 14:23 2278839

santey007, от какого момента нужно отсчитывать эти 36 часов?

santey007 27-12-2013 08:42 2279231

Iska от момента когда в папке Destination будет более одного файла

santey007 31-12-2013 09:52 2281094

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

Iska 06-01-2014 00:43 2283640

Цитата:

Цитата 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


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

santey007 22-12-2015 10:43 2587305

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

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


Время: 09:02.

Время: 09:02.
© OSzone.net 2001-