Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Single Post  Topic: Скрипты PowerPro - опыт новичка 
Author Message
Вахмурка



PostPosted: Fri Jul 15, 2005 17:30    Post subject: Reply with quote

Скрипт 5. Копирование даты и времени
Версия 1.0. См. ниже Скрипт 9


Я уже писал об этом http://wincmd.ru/forum/viewtopic.php?t=424. Для тех, кому лень читать, вкратце изложу суть. Пусть есть цифровая фотография, которую надо отредактировать (в Фотожопе, например). Но при сохранении файла редактор изменяет время создания и/или (в зависимости от редактора) изменения и/или доступа к файлу. А одно из многочисленных достоинств цифровых фотографий состоит как раз в том, что в них зашито время, которое на них запечатлено. Поэтому хорошо бы после редактирования восстановить исходные атрибуты с файла, который, естественно, должен быть сохранен где-то в виде резервной копии.
Можно, конечно, сделать это врукопашную, в том числе командой cm_SetAttrib, но это дьявольски утомительно.
Раньше я это делал утилитой touch.exe (см. пост выше), но она имеет несколько недостатков:
1) Дата записывается в непривычном американском формате;
2) В случае ошибки с target/source надо начинать сначала;
3) Просто некрасиво Smile

Предлагаемый скрипт 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"). Или наоборот Smile ("%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. Не пугайтесь, если результат придется подождать несколько секунд - копирование работает относительно медленно. Об окончании процесса вас известят Smile


Last edited by Вахмурка on Mon Aug 29, 2005 22:20; edited 1 time in total
View user's profile Send private message Send e-mail Visit poster's website


Powered by phpBB © 2001, 2005 phpBB Group