Что нового

[Автоматизация] Перенос файлов старше х минут

awk3620

Новичок
Сообщения
5
Репутация
0
Версия AutoIt: 3.3.12.0

Описание:
Добрый день, возникла необходимость переносить логи транзакций на другой сервер. Перенести не все а только те которые старше Х минут. Поможете если в автоите есть такая возможность?
Спасибо.

Скрипт должен работать следующим образом
Скопировать из папки А в папку Б файлы старше 5 минут, без перезаписи имеющихся уже в папке Б файлов.
Примечания:
 
Автор
A

awk3620

Новичок
Сообщения
5
Репутация
0
Ребят ну помогите кто нибудь, неужели задача не решаема?
 

Skif_off

Знающий
Сообщения
173
Репутация
12
awk3620
Что-нибудь вроде
Код:
#include <File.au3>

$sPath = 'C:\Temp'
$sPathToCopy = 'D:\Temp'

; Вместо '*' указать формат файлов
$aFileList = _FileListToArray($sPath, '*', 1)

For $i = 1 To $aFileList[0]
    $iAccessedTime = ''
    $iCurrentTime = @YEAR & @MON & @MDAY & @HOUR & @MIN & @SEC
    $iAccessedTime = FileGetTime($aFileList[$i], 2, 1)
    If $iCurrentTime - $iAccessedTime >= 500 Then
        If Not FileExists($sPathToCopy & '\' & $aFileList[$i]) Then
            FileCopy($sPath & '\' & $aFileList[$i], $sPathToCopy & '\' & $aFileList[$i], 0)
        Else
            ; Если файл есть, копируется с добавлением к имени "_YYYYMMDDHHMMSS" (на всякий случай)
            $aFileName = _FO_PathSplit($aFileList[$i])
            FileCopy($sPath & '\' & $aFileList[$i], $sPathToCopy & '\' & $aFileName[1] & _ & $iCurrentTime & $aFileName[2], 0)
        EndIf
    EndIf
Next

?
Но у меня частенько получается несколько громоздко и не оптимально :smile: С первого раза, по крайней мере. И насчет >= 500 не уверен.
 

ildar

Осваивающий
Сообщения
252
Репутация
29
Обычный bat
Код:
@echo off
echo Start %time%
xcopy "\\откуда" "\\кудa" /e/d/h/z/y/v/c/k/r/f
echo Stop %time%
ставишь в планировщик, на каждые 5 минут. Копирует все файлы. Если есть одинаковые(без изменений), то их не трогает.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Код:
Global Const $dir_dest = 'D:\dir' ;папка куда копировать. Папка должна существовать.

main()

Func main()
	Local $hSearch = FileFindFirstFile('*.log')
	If $hSearch = -1 Or @error Then Exit 1

	Local Const $FT_CREATED = 1
	Local $now = @YEAR & @MON & @MDAY & @HOUR & @MIN & @SEC, _
			$file_name, $file_time
	While 1
		$file_name = FileFindNextFile($hSearch)
		If @error Then ExitLoop

		$file_time = FileGetTime($file_name, $FT_CREATED, 1)
		If @error Then ContinueLoop

		If разница между $now и $file_time больше 5 минут Then
			FileCopy($file_name, $dir_dest)
		EndIf
	WEnd
EndFunc


Скрипт запустить из папки, в которой логи.
 
Автор
A

awk3620

Новичок
Сообщения
5
Репутация
0
Ваш скрипт работает так как надо, спасибо. Есть 2 вопроса: 1. Можно ли сделать так что бы он работал не из папки с логами и 2. Цифра "500" в скрипте, это как я понимаю 7 минут или что за единица измерения? Я спрашиваю к тому, что если возникнет необходимость поменять ее на 10 мин или еще, что то, как вычислить какую цифру нужно ставить? Спасибо
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
inververs
Такой вариант годится только для сравнения больше/меньше.

Банальный пример:
Код:
185900
190000

Прошла всего минута, однако ваш скрипт не обработает этот файл.

awk3620
Используйте UDF Date.au3
Код:
_DateDiff
 
Автор
A

awk3620

Новичок
Сообщения
5
Репутация
0
awk3620
Используйте UDF Date.au3
Код:
_DateDiff

[/quote]
Не могли бы вы поподробнее написать о _DateDiff, т.е. как в теории должно быть понятно, но на практике скрипт либо не срабатывает, либо выдает ошибки. Спасибо
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
На основе примера inververs'а:

Код:
#Include <Date.au3>
Global Const $dir_dest = 'D:\dir' ;папка куда копировать. Папка должна существовать.

main()

Func main()
    Local $hSearch = FileFindFirstFile('*.log')
    If $hSearch = -1 Or @error Then Exit 1

    Local Const $FT_CREATED = 1
    Local $now = _NowCalc(), _
            $file_name, $file_time
    While 1
        $file_name = FileFindNextFile($hSearch)
        If @error Then ExitLoop

        $file_time = StringRegExpReplace( FileGetTime($file_name, $FT_CREATED, 1), "^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})", "$1/$2/$3 $4:$5:$6" )
        If @error Then ContinueLoop

        If _DateDiff('n', $file_time, $now) <= 5 Then ;Не более пяти минут
            FileCopy($file_name, $dir_dest)
        EndIf
    WEnd
EndFunc
 
Автор
A

awk3620

Новичок
Сообщения
5
Репутация
0
firex спасибо, и вообще всем спасибо за участие.
на примерах приведенных выше написал немножко своего кода и получилось

Код:
#include <Date.au3>
$path = ('fileDir'); каталог с файлами
$search = FileFindFirstFile($path & '\*.*')
While 1
    $file = FileFindNextFile($search)
    If @error Then ExitLoop
    $aTime = FileGetTime($path & '\' & $file)
    If _DateDiff('s', $aTime[0] & '/' & $aTime[1] & '/' & $aTime[2] & ' ' & $aTime[3] & ':' & $aTime[4] & ':' & $aTime[5], _NowCalc()) >= 60 Then FileCopy($path & '\' & $file , 'copyDir') ; каталог для копирования
WEnd


Проверил, работает, можно указывать любой промежуток времени в любых единицах, см. подробнее о _DateDiff (у меня указаны секунды, если файл в filedir старше 60 секунд он копируется в copydir)


Добавлено:
Сообщение автоматически объединено:

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