Script Request

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

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

Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

laburj писал(а):но в "Разном" поискать её догадался
С учётом "но", наверное, следовало написать "не догадался".) В "Разном" есть смысл искать только в случае непосредственного назначения командам комбинаций клавиш. А так этот диалог "Выбор команды" вызывается либо из меню - Инструменты>Список команд ТС, либо командой cm_CommandBrowser.
laburj
Сообщения: 186
Зарегистрирован: Пн мар 07, 2005 07:04

Сообщение laburj »

Flasher
С учётом "но", наверное, следовало написать "не догадался".)
да-да, ты прав! отправил сообщение, не прочитав.
А так этот диалог "Выбор команды" вызывается либо из меню - Инструменты>Список команд ТС, либо командой cm_CommandBrowser
я так обычно и ищу
Аватара пользователя
Йяхе
Сообщения: 32
Зарегистрирован: Вс июн 14, 2009 00:13

Сообщение Йяхе »

Друзья, такая задача: по хоткею добавлять текущую дату_время в конец имени файла\каталога.
Вот так:
Имя_файла_DD-MM-YYYY`HH-MM-SS.расширение
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Йяхе писал(а):Друзья, такая задача: по хоткею добавлять текущую дату_время в конец имени файла\каталога.
Вот так:
Имя_файла_DD-MM-YYYY`HH-MM-SS.расширение
vbs:

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

'==========================================================
' Переименование файла\папки -
'   Добавление текущей даты_времи в конец имени: 
'   Имя_файла_DD-MM-YYYY`HH-MM-SS.расширение
'
' Параметры:
' {файл\папка}
'
' Пример параметров при вызове из TC: 
' %P%N
'==========================================================
Option Explicit
Dim FSO, NameAdd, F
Set FSO = CreateObject("Scripting.FileSystemObject")

F = WScript.Arguments(0)

'Текущие дата и время вида DD.MM.YYYY H:MM:SS
NameAdd = Now
'Преобразуем к виду DD-MM-YYYY`HH-MM-SS
NameAdd = Replace(NameAdd, ":", "-")
NameAdd = Replace(NameAdd, ".", "-")
NameAdd = Left(NameAdd, 10) & "`" & Right("0" & Mid(NameAdd, 12), 8)

If FSO.FileExists(F)   Then FSO.GetFile(F).Name   = FSO.GetBaseName(F)    & "_" & NameAdd & "." & FSO.GetExtensionName(F)
If FSO.FolderExists(F) Then FSO.GetFolder(F).Name = FSO.GetFolder(F).Name & "_" & NameAdd

Set FSO = Nothing
WScript.Quit
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
Йяхе
Сообщения: 32
Зарегистрирован: Вс июн 14, 2009 00:13

Сообщение Йяхе »

Batya, большое спасибо!
Меняет имя у объекта под курсором.
Скажите, возможно ли выделенные файлы\каталоги обработать?
Или нужно скрипт изменять?
Попробовал другие параметры - не работает...
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Йяхе
Всё возможно. Только про выделенные файлы\каталоги выше речи не было.
Изменение параметров не поможет :)
Скрипт менять нужно. Сделаю.
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
Йяхе
Сообщения: 32
Зарегистрирован: Вс июн 14, 2009 00:13

Сообщение Йяхе »

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

Сообщение Flasher »

Йяхе
Если будет учитываться параметр %P%S, то это замечание явно роли не сыграет. Файл под курсором будет обрабатываться аналогично выделенному списку.
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Йяхе писал(а):Нужно менять имена либо выделенных файлов\каталогов, либо, если объект один, - того, который под курсором.

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

'==========================================================
' Переименование файлов\папок по файлу-списку -
'   Добавление текущей даты_времи в конец имени:
'   Имя_файла_DD-MM-YYYY`HH-MM-SS.расширение
'
' Параметры:
' {файл-список}
'
' Пример параметров при вызове из TC:
' %L
'==========================================================
Option Explicit
Dim FSO, NameAdd, List, F
Set FSO = CreateObject("Scripting.FileSystemObject")

List = WScript.Arguments(0)

'Текущие дата и время вида DD.MM.YYYY H:MM:SS
NameAdd = Now
'Преобразуем к виду DD-MM-YYYY`HH-MM-SS
NameAdd = Replace(NameAdd, ":", "-")
NameAdd = Replace(NameAdd, ".", "-")
NameAdd = Left(NameAdd, 10) & "`" & Right("0" & Mid(NameAdd, 12), 8)

For Each F In Split(FSO.OpenTextFile(List).ReadAll, vbNewLine)
  If F <> "" Then
    If FSO.FileExists(F)   Then FSO.GetFile(F).Name   = FSO.GetBaseName(F)    & "_" & NameAdd & "." & FSO.GetExtensionName(F)
    If FSO.FolderExists(F) Then FSO.GetFolder(F).Name = FSO.GetFolder(F).Name & "_" & NameAdd
  End If
Next

Set FSO = Nothing
WScript.Quit
Небольшой комментарий по условиям задачи - на мой взгляд было бы правильнее вставлять в имя дату не в формате DD-MM-YYYY, а YYYY-MM-DD. Так сортировка будет нормально по имени работать при одинаковой начальной части имени файла\папки.
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
Йяхе
Сообщения: 32
Зарегистрирован: Вс июн 14, 2009 00:13

Сообщение Йяхе »

Batya, благодарю!
дату не в формате DD-MM-YYYY, а YYYY-MM-DD
Да, резонно.
Аватара пользователя
Йяхе
Сообщения: 32
Зарегистрирован: Вс июн 14, 2009 00:13

Сообщение Йяхе »

Batya, будьте Вы добры, заключительную поправку внесите, по поводу YYYY-MM-DD.
Мне понятно где, но как... :)
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Сообщение Tol!k »

Йяхе, так:

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

NameAdd = Mid(NameAdd, 7, 4) & Mid(NameAdd, 3, 4) & Left(NameAdd, 2) & "`" & Right("0" & Mid(NameAdd, 12), 8)
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Скрипт для переименования по собственной маске (маска может быть задана вторым параметром или по умолчанию через константу DefaultMask в теле скрипта):

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

'==============================================================
' Переименование файлов\папок в файле-списке по заданной маске.
'   Возможные элементы маски (с учётом регистра):
'   NNN  - имя файла\папки;
'   EEE  - расширение - только для файлов;
'   YYYY - текущий год - 4 цифры;
'   YY   - текущий год - 2 последние цифры;
'   DD   - текущий день - всегда 2 цифры;
'   D    - текущий день - убирается лидирующий 0;
'   MM   - текущий месяц - всегда 2 цифры;
'   M    - текущий месяц - убирается лидирующий 0;
'   hh   - текущий час - всегда 2 цифры;
'   h    - текущий час - убирается лидирующий 0;
'   mm   - текущая минута - всегда 2 цифры;
'   m    - текущая минута - убирается лидирующий 0;
'   ss   - текущая секунда - всегда 2 цифры;
'   s    - текущая секунда - убирается лидирующий 0;
'   ..   - точка (1 символ) - только для файлов.
'
' Параметры:
' {файл-список} [{маска}]
'
' Параметр "маска" не является обязательным -
'   будет использовано значение по умолчанию.
'
' Пример параметров при вызове из TC:
' %L "NNN_YYYY-MM-DD`hh-mm-ss..EEE"
'==============================================================
Option Explicit
'====== Изменяемые параметры ==================================
' Маска по умолчанию
Const DefaultMask = "NNN_YYYY-MM-DD`hh-mm-ss..EEE"
'==============================================================
Dim FSO, List, F, Mask, NowTime, E
Set FSO = CreateObject("Scripting.FileSystemObject")
Set E   = CreateObject("Scripting.Dictionary")

With WScript
  List = .Arguments(0)
  If .Arguments.Count > 1 Then
    Mask = .Arguments(1)
  Else
    Mask = DefaultMask
  End If
End With

NowTime = Now

With E
  .Add "YYYY", Year(NowTime)
  .Add "YY"  , Right(Year(NowTime), 2)
  .Add "DD"  , Right("0" & Day(NowTime), 2)
  .Add "D"   , Day(NowTime)
  .Add "MM"  , Right("0" & Month(NowTime), 2)
  .Add "M"   , Month(NowTime)
  .Add "hh"  , Right("0" & Hour(NowTime), 2)
  .Add "h"   , Hour(NowTime)
  .Add "mm"  , Right("0" & Minute(NowTime), 2)
  .Add "m"   , Minute(NowTime)
  .Add "ss"  , Right("0" & Second(NowTime), 2)
  .Add "s"   , Second(NowTime)
  .Add "NNN" , ""
  .Add "EEE" , ""
  .Add ".."  , ""
End With

For Each F In Split(FSO.OpenTextFile(List).ReadAll, vbNewLine)
  If F <> "" Then
    If FSO.FileExists(F) Then
      E("NNN") = FSO.GetBaseName(F)
      E("EEE") = FSO.GetExtensionName(F)
      E("..")  = "."
      FSO.GetFile(F).Name = ReplaceAll(Mask, E)
    ElseIf FSO.FolderExists(F) Then
      E("NNN") = FSO.GetFolder(F).Name
      E("EEE") = ""
      E("..")  = ""
      FSO.GetFolder(F).Name = ReplaceAll(Mask, E)
    End If
  End If
Next

Set E   = Nothing
Set FSO = Nothing
WScript.Quit

Function ReplaceAll(pName, pDic)
  Dim lK
  ReplaceAll = pName
  For Each lK In pDic.Keys
    ReplaceAll = Replace(ReplaceAll, lK, pDic(lK), 1, -1, 0)
  Next
End Function
Нет, я не сплю. Я просто медленно моргаю.
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

Batya писал(а):Скрипт для переименования по собственной маске
Удобно! Вот только может, ещё до кучи ввести последовательное добавление _2, _3 и т.д. для уже существующих имён файлов\папок?
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

sa писал(а):Вот только может, ещё до кучи ввести последовательное добавление _2, _3 и т.д. для уже существующих имён файлов\папок?
Сделал, только пока не выкладывал:
CC[n] - счётчик, где n - минимальное кол-во цифр счётчика.

sa
Вопрос:
:?: Как, на твой взгляд, должны быть переименованы по маске "YYYYMMDD_CC[2]..EEE" файлы:
Name1.txt
Name2.doc
20100601_02.xls
Нет, я не сплю. Я просто медленно моргаю.
Ответить