Автоматизация переноса атрибутов и времени изменения файлов

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

Аватара пользователя
oshizelly
Сообщения: 52
Зарегистрирован: Вт сен 04, 2012 14:08

Сообщение oshizelly »

Flasher
У меня вообще чудеса какие-то происходят с этой кнопкой.

1. Под TC 7.02 работает только для файла, явным образом прописанного в кнопке, например вот так:
setfilefoldertime %V "d:\testfile.txt" "01-01-2100 00:00:00" "31-01-2100 1:22:33"
Для выделенного (текущего) файла под курсором - не работает.
А точно синтаксис описания файла ("" "") правильный?

2. Из-под TC 8.01 не работает вообще, хотя ничего не меняю, просто копирую работающую кнопку из 7.02.

3. С присваиваемым временем вроде бы проблем нет, ничего никуда не сдвигается.
Правда, есть одна странность: секунды округляются до четных значений. На разделе с FAT так и должно быть, но почему это происходит на разделе NTFS - загадка. Но это - баг (или фича??) самого Nircmd.exe, к тоталу отношения не имеет.

А что такое "открыт"? Это не "access time" случайно? Может, мы про разные атрибуты говорим?
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

oshizelly
1. Советую почитать справку ТС на предмет параметров. %V в версии 7.02 не поддерживается. %V и "d:\testfile.txt" писать вместе бессмысленно.
У меня синтаксис правильный.
2. А как же будет работать, если копируется неверная кнопка вместо моей?
3. У меня с секундами проблем нет. Только с часами.

"Открыт" отражает время последнего доступа. Вполне логичное название.
Аватара пользователя
oshizelly
Сообщения: 52
Зарегистрирован: Вт сен 04, 2012 14:08

Сообщение oshizelly »

Flasher
Flasher писал(а):А как же будет работать, если копируется неверная кнопка вместо моей?
Да нет, я с TC 8.01 как раз сначала пробовал оригинальный синтаксис вот так:
setfilefoldertime %V "" "" "01-01-2012 08:08:08" "01-01-2012 08:08:08"
Не работает для выделенного файла :(
Для явным образом прописанного файла - работает (если убрать параметр %V)

Сдвиг на 1 час - это явно что-то с поясным временем связано. Может, попробовать в порядке эксперимента изменить в настройках системы часовой пояс или снять галку автоматического перехода на летнее время?
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

oshizelly писал(а):Да нет, я с TC 8.01 как раз сначала пробовал оригинальный синтаксис вот так:
setfilefoldertime %V "" "" "01-01-2012 08:08:08" "01-01-2012 08:08:08"
Оригинальный синтаксис написан в моей кнопке. Не надо никаких самостоятельных экспериментов. Мы так до следующей недели протянем..
oshizelly писал(а):Сдвиг на 1 час - это явно что-то с поясным временем связано.
Откуда тут связь с часовыми поясами, если мы явно задаём конкретное время?
Аватара пользователя
oshizelly
Сообщения: 52
Зарегистрирован: Вт сен 04, 2012 14:08

Сообщение oshizelly »

Flasher
Flasher писал(а):Оригинальный синтаксис написан в моей кнопке. Не надо никаких самостоятельных экспериментов.
Так я же оттуда и скопировал. В чем отличие от указанного там синтаксиса - не понимаю :roll: Разве что от себя добавил второй параметр на изменение времени модификации, так это точно на скорость не влияет, без него тоже не работает.

Flasher писал(а):Откуда тут связь с часовыми поясами, если мы явно задаём конкретное время?
Не знаю, откуда. Это просто гипотеза. Я мог бы долго рассуждать и аргументировать, почему я считаю такую штуку возможной... Но не проще ли проверить? Это вряд ли займёт больше 2 минут.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

oshizelly писал(а):В чем отличие от указанного там синтаксиса - не понимаю
В общем-то, результат будет аналогичный, но последний параметр ничего не даст, он будет проигнорирован. Даты всего 3, а не 4.

А битность у системы не 64, случаем?
Последний раз редактировалось Flasher Сб сен 08, 2012 20:45, всего редактировалось 1 раз.
Аватара пользователя
oshizelly
Сообщения: 52
Зарегистрирован: Вт сен 04, 2012 14:08

Сообщение oshizelly »

Flasher писал(а):А битность у ТС не 64, случаем?
Нет, TC 8.01 x32. Кстати, ось - Win XP 32, хотя это вряд ли имеет значение.
Flasher писал(а):, но последний параметр ничего не даст, он будет проигнорирован. Даты всего 3, а не 4.
Конечно, три! Но у тебя в образце вообще только одна дата - это create time (дата создания). В моем дополненном примере - две даты: дата создания и дата модификации. А если еще задействовать и дату last access, которую гениальный переводчик окон назвал "датой открытия" (вообще-то оно "время последнего доступа"), то будет вот так:
setfilefoldertime %V "" "" "01-01-2012 08:08:08" "01-01-2012 08:08:08" "01-01-3100 09:09:09"

:off:
Навеяло:
У чукчи спрашивают, что дала ему советская власть.
- Очень много дала, однако! Раньше у чукчи было два чувства: чувство голода и чувство холода. Сейчас у него их три: чувство голода, чувство холода и чувство глубокого морального удовлетворения.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

oshizelly писал(а):Нет, TC 8.01 x32. Кстати, ось - Win XP 32, хотя это вряд ли имеет значение.
Пардон, я про битность системы хотел узнать. У меня семёрка. Значение может и иметь.
oshizelly писал(а):Конечно, три! Но у тебя в образце вообще только одна дата - это create time (дата создания).
Не создания, а доступа (Accessed), в том то и дело. Для того пустые кавычки и ставятся, чтобы проигнорировать первые две. Это общепринятый синтаксис.
oshizelly писал(а):то будет вот так
Глупости. Тут тогда пустые кавычки зачем вообще? :? См. справку по nircmd.

LonerD, ты где там? Помогать будешь? Изображение
Последний раз редактировалось Flasher Сб сен 08, 2012 21:27, всего редактировалось 1 раз.
Аватара пользователя
oshizelly
Сообщения: 52
Зарегистрирован: Вт сен 04, 2012 14:08

Сообщение oshizelly »

Flasher
Черт, все, разобрался наконец, почему у меня для файла под курсором не работало. Рассказывать не буду, чтобы не стать посмешищем всего интернета. :oops: Ограничусь констатацией, что эта часть проблемы решена.
Flasher писал(а):Не создания, а доступа, в том то и дело.
Created - время создания файла/папки
Modified - время модификации
Last Acccessed - время последнего доступа
Так вот примерно...

Кстати, важное замечание: при вызове системного диалога свойств файла (properties) время последнего доступа (которое в русском переводе "открыт") может обновляться на текущее. Наверное, потому что при вызове этого диалога система как раз и осуществляет доступ к файлу для считывания свойств файла... А может и не меняться. От чего это зависит - не знаю.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

oshizelly писал(а):Рассказывать не буду, чтобы не стать посмешищем всего интернета.
Если всего, то ты многое упускаешь, это ж какой пиар (на этом можно состояние сколотить). :wink:
oshizelly писал(а):Так вот примерно..
Я не про перевод, а про то, что идёт в команде.
По переводу:
Только дата и время. А так всё верно. Урок английского для второго класса. :wink:
И, кстати, в мануале написано "Accessed Date", а не "Last Acccessed".
oshizelly писал(а):Кстати, важное замечание
На 7 такого нет..
Может, тогда ну его, доступ?
Аватара пользователя
oshizelly
Сообщения: 52
Зарегистрирован: Вт сен 04, 2012 14:08

Сообщение oshizelly »

Flasher писал(а):Может, тогда ну его, доступ?
Как по мне, так можно без него обойтись. Реально важны время создания и модификации. :D
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Ну, вообще, конечно, не помешает. Пробуйте.

Код: Выделить всё

'==================================================================================
' Изменение даты и времени выбранных файлов и папок активной панели на дату и время
' указанного файла/папки с возможностью рекурсивной обработки содержимого папок

' Параметры: "<путь к файлу>" %WL <индекс замены> <флаг рекурсии: 1>

' Путь к файлу: %V (активной панели) | %T%M (пассивной панели)

' Индекс замены принимает следующие значения:
' 1 - даты создания
' 2 - даты модификации
' 3 - даты последнего открытия
' 4 - даты создания и модификации
' 5 - даты создания и последнего открытия
' 6 - даты модификации и последнего открытия
' 7 - даты модификации, создания и последнего открытия

' Примеры параметров:  %T%M %WL 2  |  %V %WL 7  |  "C:\Тест" %WL 4 1

' Автор: Flasher ©
'================================= Путь к NirCmd ==================================
Nircmd = """%COMMANDER_PATH%\Utils\nircmd\nircmd.exe"""
'==================================================================================
With WScript.Arguments
  C = .Count : If C = 0 Then Quit
  File = .Item(0) : List = .Item(1) : Count = .Item(2)
End With : L = vbNewLine
If Not IsNumeric(Count) Then Msg
If Count < 1 Or Count > 7 Then Msg
Sub Msg
  MsgBox "Недопустимый индекс замены!"&L&L&"Смотрите описание.", 48, Space(30) & "Ошибка"
  WScript.Quit
End Sub

Set FSO   = CreateObject("Scripting.FileSystemObject")
Dim WSH : Set WSH = CreateObject("Wscript.Shell")
Set Shell = CreateObject("Shell.Application")

If FSO.FileExists(File) Then Set File  = FSO.GetFile(File) Else Set File = FSO.GetFolder(File)
DC = File.DateCreated : DM = File.DateLastModified : DA = File.DateLastAccessed
Repl DC : Repl DM : Repl DA : Set File = Nothing

Sub Repl(DT) 
  Dy = Day(DT) : Mh = Month(DT) : Yr = Year(DT) : Hr = Hour(DT) : Mn = Minute(DT) : Sc = Second(DT)
  Num(Dy)(Mh)(Yr)(Hr)(Mn)(Sc)(Sc)
  If InStrRev(DT, "P") Then : If Hr < 12 Then Hr = Hr + 12 : End If
  DT = """" & Dy & "-" & Mh & "-" & Yr & " " & Hr & ":" & Mn & ":" & Sc & """"
End Sub

Function Num(DateT)
  If Len(DateT) = 1 Then DateT = "0" & DateT
  Set Num = GetRef("Num")
End Function

Select Case Count
  Case 1 P = DC
  Case 2 P = """"" " & DM
  Case 3 P = """"" """" " & DA
  Case 4 P = DC & " " & DM
  Case 5 P = DC & " """" " & DA
  Case 6 P = """"" " & DM & " " & DA
  Case 7 P = DC & " " & DM & " " & DA
End Select

For Each F in Split(FSO.GetFile(List).OpenAsTextStream(1, -1).ReadAll, L)
  If FSO.FolderExists(F) Then
    F = Left(F, Len(F) - 1) : ForFile F, P
    If C = 4 Then : Set F = FSO.GetFolder(F) : ForFolder F, P : End If
  Else ForFile F, P : End If
Next : Set FSO = Nothing : Set WSH = Nothing : Set Shell = Nothing : WScript.Quit

Sub ForFolder(Fd, Par)
  For Each Fl In Fd.SubFolders : ForFile Fl, Par : ForFolder Fl, Par : Next
  For Each Fl In Fd.Files      : ForFile Fl, Par : Next
End Sub
Sub ForFile(FF, PP) : WSH.Run Nircmd & " setfilefoldertime """ & FF & """ " & PP, 0, True : End Sub
Последний раз редактировалось Flasher Вс сен 16, 2012 17:34, всего редактировалось 5 раз.
Аватара пользователя
oshizelly
Сообщения: 52
Зарегистрирован: Вт сен 04, 2012 14:08

Сообщение oshizelly »

Flasher писал(а):Пробуйте.
Все тот же наивный вопрос чайника: чего с этим делать и куда сувать? По внешнему виду ясно, что это какой-то скрипт. Но для скрипта ведь требуется какой-то обработчик? :roll:
Flasher писал(а):Изменение дат и времени выбранных файлов активной панели
А почему - "активной"? Это не опечатка? Для сравнения: утилита Volniy копировала значения атрибутов времени с выделенного (текущего( файла на активной панели на выделенный файл на пассивной панели. А тут какой алгоритм? Надо файлы предварительно выделять явным образом?
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

oshizelly
Сохрани с расширением vbs, а дальше по памятке подфорума.

Активной, потому что так проще (не надо регистрировать доп. ActiveX-компонент), чтобы прочесть выбранный список другой панели.
Для одного файла явное указание/выделение, естественно, не требуется. Чтобы видеть, на каком курсоре стоит файл в пассивной панели, используй соотв. настройку для TC (wincmd.ini либо TwinKey).
oshizelly писал(а):А тут какой алгоритм? Надо файлы предварительно выделять явным образом?
В шапке скрипта приведёны примеры указания файла (пассивная/активная панель), с которого читаются даты.
Да, естественно, не только выбранных файлов, но и папок, забыл в названии написать.

Add: убрал лишний параметр, кое-что исправил.
Аватара пользователя
oshizelly
Сообщения: 52
Зарегистрирован: Вт сен 04, 2012 14:08

Сообщение oshizelly »

Flasher
Сделал, как описано вот здесь http://forum.wincmd.ru/viewtopic.php?t=14282 , все работает!! Я счастлив до полного изнеможения! Спасибо! Изображение
Flasher писал(а):Активной, потому что так проще (не надо регистрировать доп. ActiveX-компонент), чтобы прочесть выбранный список другой панели... В шапке скрипта приведёны примеры указания файла (пассивная/активная панель), с которого читаются даты.
Прошу прощения, не понял. Так можно скрипт так настроить, чтобы в качестве источника при копировании значений штампом времени использовался файл в активной панели и копировалось на файл в пассивной? Я пробовал несколько вариантов, даже перечел раздел справки по параметрам кнопок, включая %V и %WL, но яснее не стало :cry: Пробовал менять параметры местами вот так
%WL %T%M 7
и вот так
%V %T%M 7
но не работает...
Flasher писал(а):Чтобы видеть, на каком курсоре стоит файл в пассивной панели, используй соотв. настройку для TC (wincmd.ini либо TwinKey).
Про TwinKey знаю, что умеет подсвечивать текущий файл в пассивной панели, но до сих пор этой утилитой не пользовался. А как то же самое сделать штатными средствами TC? :D
Ответить