1 (изменено: Galogenid, 2015-09-24 09:50:34)

Тема: AHK: Переименование последнего файла

Приветствую, господа. В AHK любитель, посему некоторые дебри для меня ещё пока недоступны. Поиск по форуму/гуглу особых результатов не принес, потому решил обратиться к здешним скриптёрам.

Проблема такова: Существует папка dir1. В этой папке, каждые несколько минут создаются файлы с расширением ".doc". Формат имени: "Word YYYY-MM-DD HH-mm-SS-000.doc" <- последнее не знаю как назвать, там три цифры всегда, миллисекунды, как я понимаю, либо кадры. Получается каждый файл имеет примерное название: "Word 2015-09-24 10-44-35-766.doc"

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

Например:
* При нажатии Alt+1 - files
* При нажатии Alt+2 - email

То есть, для примера, конечный результат будет выглядеть так: "Word 2015-09-24 10-44-35-766 email.doc". Надеюсь разъяснил проблему, буду очень благодарен за помощь.

2

Re: AHK: Переименование последнего файла

!1::
!2::
Name := ""
SetWorkingDir, %A_ScriptDir%\dir1\
Loop, *.*, 1
Name := Name A_LoopFileTimeModified "`t" A_LoopFileName "`n"
Sort, Name, r ; Сортировать по дате.
Loop, parse, Name, `n
{
StringSplit, Name, A_LoopField, %A_Tab%
StringReplace, Name, Name2,`.doc
IfInString, Name2, files
    Return
IfInString, Name2, email
    Return
FileMove, %Name2%, % Name A_Space (A_ThisHotkey = "!1" ? "files" : "email") ".doc"
Break
}
Return 

Loop считывает все названия файлов (и их время редактирования) в переменную.
Sort сортирует названия, так что-бы последняя редактируемое имя стало первым.
Loop, parse считывает построчно, поскольку интересует только первая, цикл повторяется 1 раз.
StringSplit разделяет переменную, так что-бы имя и дата редактирования были отдельно.
IfInString проверяет есть ли в имени файла текста который мы добавляем.
FileMove переименовывает файл.

3 (изменено: yalanne, 2015-09-24 19:42:00)

Re: AHK: Переименование последнего файла

path := A_ScriptDir "\dir1"
ext := ".doc"
!1::
!2::
lastFile :=""
Loop, Files,%path%\*%ext%
    RegExMatch(A_LoopFileName,"(^Word \d{4,4}-\d{2,2}-\d{2,2} \d{2,2}-\d{2,2}-\d{2,2}-\d{3,3}.*)\" ext,_t) and (lastFile:=_t1)
if lastFile and (lastFile ~= "(files|email)$")
    Msgbox, 0x10,Информация,% "У последнего файла """ lastFile ext """ уже есть окончание!"
Else if lastFile and !(lastFile ~= "(files|email)$")
{
    FileMove %path%\%lastFile%%ext%,% path "\" lastFile " " ((A_ThisHotkey = "!1") ? "files" : "email") ext
    Msgbox, 0x40,Информация,% "Файл`t`t""" lastFile ext """`nПеременован в`t""" lastFile " " ((A_ThisHotkey = "!1") ? "files" : "email") ext """"
}
return

Исправил если что.

4

Re: AHK: Переименование последнего файла

yalanne

if (lastFile ~= "^Word \d{4,4}-\d{2,2}-\d{2,2} \d{2,2}-\d{2,2}-\d{2,2}-\d{3,3}$")

А где можно почитать, что это за строчка?

5 (изменено: yalanne, 2015-09-24 16:37:01)

Re: AHK: Переименование последнего файла

* исправил немного.
Nikva, Это RegExMatch, в кавычках указывается NeedleRegEx(шаблон). А насчет вики не знаю, я этот способ в каком то скрипте позаимствовал.

То что в цитате там следующие:
^ - Означает что поиск будет с начала строки.
Word - означает то что имя хоть как начинаться должно с этого.
\d{4,4} - означает что 4 любые цифры должны быть подряд.
- после 4х цифр должно быть тире.

цифры,тире...цифры,тире.
$ - конец строки.

6 (изменено: Malcev, 2015-09-24 18:38:36)

Re: AHK: Переименование последнего файла

Можно сделать вотчфолдер:
http://forum.script-coding.com/viewtopi … 808#p83808

7

Re: AHK: Переименование последнего файла

1) Galogenid, а что, если за время между проверками появилось несколько новых файлов?
2) А зачем определять новизну файлов по их имени, когда есть атрибуты "Создан", "Изменён"?

Обобщая вышесказанное... Может проще периодически проверять файлы в папке по дате создания и добавлять их в список для обработки? А по мере обработки убирать их из списка. При этом в какой-нибудь переменной держать дату, старше которой файлы считать обработанными.

Можно проще, если Вас это устроит: все обработанные файлы перекидывать в другую папку, чтобы в первичной папке не прочёсывать каждый раз все файлы.

8

Re: AHK: Переименование последнего файла

ypppu пишет:

1) Galogenid, а что, если за время между проверками появилось несколько новых файлов?
2) А зачем определять новизну файлов по их имени, когда есть атрибуты "Создан", "Изменён"?
3) Обобщая вышесказанное... Может проще периодически проверять файлы в папке по дате создания и добавлять их в список для обработки? А по мере обработки убирать их из списка. При этом в какой-нибудь переменной держать дату, старше которой файлы считать обработанными.
4) Можно проще, если Вас это устроит: все обработанные файлы перекидывать в другую папку, чтобы в первичной папке не прочёсывать каждый раз все файлы.

Отвечу обо всём по порядку.
1. Новый файл появляется с интервалом 1-10 минут, то есть сразу так молниеносно не появится.
2. Я просто предположил сортировать по имени, а про эти два атрибута как-то не подумал вовсе.
3. Уже думал над подобным решением проблемы, но не хотелось бы цикличный скрипт постоянно работающий.
4. Стоит ограничение на максимальное количество файлов - 30 штук. Сервер не слабый, посему думаю в данном случае никаких проблем не будет. (=

Теперь по поводу решений.

Решение от товарища Nikva, идеально работает. Тестил только что, вроде ошибок никаких нет. За что огромная благодарность данному пользователю.

По поводу второго решения, от пользователя yalanne, есть проблема. При активации любой из комбинаций, выдает окно:
http://fnx0.ru/files/screens/2015-09-24_201052.png

И такое же аналогичное другой комбинации. Посему, будем пользовать первое предоставленное решение в теме. Ну и отдельное спасибо за предоставленные ссылки и описание.

Спасибо всем отписавшимся в теме. Проблема решена!