Вахмурка

|
Posted: Fri Jul 15, 2005 17:30 Post subject: |
|
|
Скрипт 5. Копирование даты и времени
Версия 1.0. См. ниже Скрипт 9
Я уже писал об этом http://wincmd.ru/forum/viewtopic.php?t=424. Для тех, кому лень читать, вкратце изложу суть. Пусть есть цифровая фотография, которую надо отредактировать (в Фотожопе, например). Но при сохранении файла редактор изменяет время создания и/или (в зависимости от редактора) изменения и/или доступа к файлу. А одно из многочисленных достоинств цифровых фотографий состоит как раз в том, что в них зашито время, которое на них запечатлено. Поэтому хорошо бы после редактирования восстановить исходные атрибуты с файла, который, естественно, должен быть сохранен где-то в виде резервной копии.
Можно, конечно, сделать это врукопашную, в том числе командой cm_SetAttrib, но это дьявольски утомительно.
Раньше я это делал утилитой touch.exe (см. пост выше), но она имеет несколько недостатков:
1) Дата записывается в непривычном американском формате;
2) В случае ошибки с target/source надо начинать сначала;
3) Просто некрасиво
Предлагаемый скрипт PowerPro (с его плагином file) лишен этих недостатков. Правда, нельзя изменить дату доступа, но разве она важна?
Code: |
local Create, Modify, Source, Target, Date, Time, Temp, FormDate, FormTime, Mess, Result
Source = arg(2)
Target = arg(1)
@start
;;Source file
Create = file.getdate(Source, "c")
Modify = file.getdate(Source, "m")
Date = select(Create, 8)
Time = select(Create, 7, 14)
Temp = select(Create, 9, 14)
FormDate = formatdate("longdate", Date)
FormTime = formattime("HH:mm:ss", Temp)
Mess = "Source file " ++ Source ++ ":[n[n" ++ "Creation Date & Time:[n" ++ FormDate ++ ", " ++ FormTime
Date = select(Modify, 8)
Time = select(Modify, 7, 14)
Temp = select(Modify, 9, 14)
FormDate = formatdate("longdate", Date)
FormTime = formattime("HH:mm:ss", Temp)
Mess = Mess ++ "[n[nModification Date & Time:[n" ++ FormDate ++ ", " ++ FormTime
;;Target file
Create = file.getdate(Target, "c")
Modify = file.getdate(Target, "m")
Date = select(Create, 8)
Time = select(Create, 7, 14)
Temp = select(Create, 9, 14)
FormDate = formatdate("longdate", Date)
FormTime = formattime("HH:mm:ss", Temp)
Mess = Mess ++ "[n[n[nTarget file " ++ Target ++ ":[n[n" ++ "Creation Date & Time:[n" ++ FormDate ++ ", " ++ FormTime
Date = select(Modify, 8)
Time = select(Modify, 7, 14)
Temp = select(Modify, 9, 14)
FormDate = formatdate("longdate", Date)
FormTime = formattime("HH:mm:ss", Temp)
Mess = Mess ++ "[n[nModification Date & Time:[n" ++ FormDate ++ ", " ++ FormTime ++ "[n[nProceed with copying date from Source to Target?[n(Choose 'No' to exchange Source <-> Target)"
Result = messagebox("yesnocancel question", Mess, "Copy Date & Time")
if(Result == 0) do
quit
elseif(Result == 6) do
Create = file.getdate(Source, "c")
Date = select(Create, 8)
Time = select(Create, 9, 14)
file.setdate(Target, "c", Date, Time)
Create = file.getdate(Source, "m")
Date = select(Create, 8)
Time = select(Create, 9, 14)
file.setdate(Target, "m", Date, Time)
elseif(Result == 7) do
Mess = Source
Source = Target
Target = Mess
jump start
endif
|
Примечания:
1) Для тех, кто совсем не в теме:
а) Создаем кнопку на панели Total Commander;
б) В поле Command пишем: "путь к PowerPro\PowerPro.exe runfile.CopyDate", где CopyDate - имя скрипта (с расширением txt);
в) В поле Parameters пишем ("%P%N", "%T%M"). Или наоборот ("%T%M", "%P%N"). Скобки важны!
г) В поле Icon file прописываем симпатичную иконку, которую качаем отсюда: http://t-n-b.narod.ru/CopyDate.ico
д) Теперь ставим курсор сначала на источник (в первом формате параметров), потом на приемник (в противоположной панели, ясен пень);
е) Жмем кнопку и наслаждаемся.
2) В скрипте встречается сочетание "[n". Это - перевод строки, добавляемый для пущей наглядности. Использовать привычную для сишников эскейп-последовательность "\n" опасно, потому что если имя файла начинается с "n", скрипт в лучшем случае выдаст ошибку, а в худшем - обработает совсем не тот файл. Следует учитывать, что TC передает в PowerPro символ материнской директории как "\", хотя сам PowerPro использует "/" (но и "\" обрабатывает корректно). Поэтому, если назначить "\" как эскейп-символ, могут возникнуть большие непрятности. Я изменил его в настройках PowerPro на "[" (ведь это запрещенный в именах файлов символ). Если у вас другие настройки, придется сделать глобальную замену.
3) Как видно из кода, скрипт можно запускать, не особо задумываясь о том, какой из файлов - источник (source), а какой - приемник (target). В случае ошибки надо нажать No, и файлы просто поменяются местами.
Скрипт 6. Список файлов
Бывает необходимо составить список файлов в текущей директории и сохранить его в виде файла. Команда "dir > _files.lst" искажает русские имена (по крайней мере в англоязычной винде). Можно воспользоваться командами ТС cm_SaveSelectionToFile, cm_CopyNamesToClip или cm_CopyFullNamesToClip, но первая из них у меня безбожно глюкает. Да и потом, слишком много надо щелкать крысой. Предлагаемый скрипт, возможно, не слишком эстетичен, зато функционален. Пояснять работу нет смысла - погоняйте его в разных режимах и увидите разницу:
Code: |
local List, Result, Subs, NamesOnly
Result = Inputdialog("Subs=Include Subfolders??, NamesOnly=Names Only??", "List Files")
if(Result == 0) do
quit
endif
Result = arg(1) ++ "_files.lst"
if(NamesOnly != 1) do
List = file.listfiles(arg(1), Subs, "")
file.writeall(Result, List)
do("путь к lister/lister.exe", Result)
quit
endif
List = file.listfiles(arg(1), 0, "")
local Count, One, Hand
Hand = file.open(Result, "w")
Count = line(List, 0)
for(i = 1; i <= Count; i = i + 1)
One = line(List, i)
One = file.nametype(One)
file.writeline(Hand, One)
endfor
file.close(Hand)
do("путь к lister/lister.exe", Result)
|
1. В поле Parameters не забываем указать ("%P")
2. Команда do("путь к lister/lister.exe", Result) - откровенное пижонство, но мне удобно. Если вы мое мнение не разделяете, эту строку можно безболезненно снести.
Скрипт 7. Размножение файлов
Бывает необходимо создать несколько копий одного файла, например, при размножении шаблона.
Code: |
local Number, NewFile
local Count = input "=2Enter number of files to duplicate"
if(Count == "") do
quit
endif
local Source = arg(1) ++ "." ++ arg(2)
for(i = 1; i <= Count; i = i + 1)
Number = i
if(i < 10) do
Number = "0" ++ i
endif
NewFile = arg(1) ++ Number ++ "." ++ arg(2)
file.copy(Source, NewFile)
endfor
messagebox ("ok information", "Duplication done", "Report")
|
Примечания:
1. В поле Parameters пишем ("%P%O", "%E").
2. На запрос вводим число (1-99) файлов, которое необходимо получить в результате размножения (без учета исходного).
3. Полученные файлы, к примеру, при текущем файле a.txt и введении числа 13 будут иметь имена a01.txt, a02.txt, ... , a13.txt.
4. Не пугайтесь, если результат придется подождать несколько секунд - копирование работает относительно медленно. Об окончании процесса вас известят 
Last edited by Вахмурка on Mon Aug 29, 2005 22:20; edited 1 time in total |
|