Групповое переименование

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

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

kin369
Сообщения: 9
Зарегистрирован: Пн ноя 23, 2009 15:26

Сообщение kin369 »

Avada
___Перед созданием темы просматривал форум, и "базу знаний", и книгу про ТК. Пробовал примерять приведённые там примеры и на их основе делать свои маски - не получилось(первый опыт с рег. выражениями, до сих пор обходилось без них). Пока не смог разобраться с применением спецсимволов... Глядя на ответ задачи, вижу, что в своём случае не доставил круглых скобок(ну и кое-что ещё) - при случае буду изучать дальше.
Batya
___Спасибо за помощь!
Iori
Сообщения: 552
Зарегистрирован: Ср апр 25, 2012 20:33

Сообщение Iori »

Пытаюсь сделать кнопку которая сразу переименовывает несколько фаилов или папок в такой вид.

ДО: любой файл
После: _любой файл

Пока сделал вот такую кнопку, но она только работает с одним файлом или с одной папкой.

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

TOTALCMD#BAR#DATA
cmd /c
ren %N _%N
shell32.dll,134
Rename Folders / Files Under Cursor into _FileName

1
-1
[/b]
Serge Yolkin
Сообщения: 664
Зарегистрирован: Сб июл 25, 2009 11:12

Сообщение Serge Yolkin »

Проверять ломает - спать хочу, но, вроде, должно работать

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

ren %S _%S
Iori
Сообщения: 552
Зарегистрирован: Ср апр 25, 2012 20:33

Сообщение Iori »

Serge Yolkin,

Делал уже такое. Меняет только один файл, но не больше.
Так-же пробовал ren "%S" "_%S", тоже самое.
Serge Yolkin
Сообщения: 664
Зарегистрирован: Сб июл 25, 2009 11:12

Сообщение Serge Yolkin »

Ну, да. Правильно. Не будет. Очень спать хочу. Батник надо прикручивать. Или скрипт. Принимать %S и в цикле поочерёдно переименовывать. Например, rename.wsf:

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

<job id="clr" version="0.1">
  <object id="f" progid="Scripting.FileSystemObject" />
  <script type="text/jscript" language="JScript">
    for(var i=0;i<WScript.Arguments.length;i++){
      if(f.fileExists(WScript.Arguments(i))){
        f.getFile(WScript.Arguments(i)).name='_'+WScript.Arguments(i);
      }
    }
  </script>
</job>
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Iori

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

TOTALCMD#BAR#DATA
%ComSpec% /c for /f "delims=" %i in
('type %WF') do ren "%%i" "_%%i""
wcmicons.dll,46
Добавить знак подчёркивания спереди имён выделенных файлов

1
Iori
Сообщения: 552
Зарегистрирован: Ср апр 25, 2012 20:33

Сообщение Iori »

Serge Yolkin
Не мучайтесь идите спать :D

Flasher
Спасибо! То что надо, но есть одно но. Кнопка работает отлично с файлами, но ничего не делает с папками.

EDIT:
И ещё, можно ли дороботать кнопку так, что бы она обратно переименовывала файлы и папки при нажатие на кнопку второй раз.

Один раз нажимаем на кнопку, получаем:
любой файл --> _любой файл

Второй раз нажимаем на кнопку, получаем:
_любой файл --> любой файл
Serge Yolkin
Сообщения: 664
Зарегистрирован: Сб июл 25, 2009 11:12

Сообщение Serge Yolkin »

Iori
Да я уже выспался...
ReReName.wsf, вызов [ReReName.wsf %S]

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

<?xml version="1.0" standalone="yes" encoding="utf-8"?>
<job id="rrn" version="0.1">
  <object id="f" progid="Scripting.FileSystemObject" />
  <script type="text/jscript" language="JScript"><![CDATA[
    for(var i=0;i<WScript.Arguments.length;i++){
      if(f.fileExists(WScript.Arguments(i))){
        if(f.getFile(WScript.Arguments(i)).name.substring(0,1)=='_'){
          f.getFile(WScript.Arguments(i)).name=
           WScript.Arguments(i).substring(1);
        }else f.getFile(WScript.Arguments(i)).name='_'+WScript.Arguments(i);
      }
    }
  ]]></script>
</job>
Особенность: если выделены файлы и на "_", и без - скрипт проинвертирует имена, т.е. те файлы, имена которых начинались на _ станут без подчерка, и наоборот.
Iori
Сообщения: 552
Зарегистрирован: Ср апр 25, 2012 20:33

Сообщение Iori »

Serge Yolkin

Спасибо вам за скрипт, но я предпочитаю либо батник либо напрямую через кнопку. На работе компьютеры не разрешают запускать скрипты. :( [/b]
Serge Yolkin
Сообщения: 664
Зарегистрирован: Сб июл 25, 2009 11:12

Сообщение Serge Yolkin »

Iori
Вы бы проверили на работе такой способ запуска:

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

wscript Диск:\Путь\КакойНибудьСкрипт.wsf
обычно сисадмины себе такую лазейку оставляют. А я бы батники перед скриптами запретил - навредить ими можно не хуже (как минимум), а писать не сложнее...
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

Iori
Хотелось бы уточнить: неужели вызов кнопкой (команда MULTIRENAME с именем шаблона) тоталовского инструмента группового переименования и последующее нажатие двух клавиш (Enter и Esc) представляет такую трудность или будет использоваться настолько часто, что непременно требует автоматизации (с трёх нажатий до одного)?
Iori
Сообщения: 552
Зарегистрирован: Ср апр 25, 2012 20:33

Сообщение Iori »

sa,

Про multirename я знаю, но хотелось бы кнопку. :)
Как говорится, каждому своё. [/b]
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

Iori писал(а):но хотелось бы кнопку
Знакомо: я тоже завёл себе когда-то скрипт, который вызывает пользовательскую команду для выполнения группового переименования по шаблону и посылает нажатия {Enter} и {ESC}.
Serge Yolkin
Сообщения: 664
Зарегистрирован: Сб июл 25, 2009 11:12

Сообщение Serge Yolkin »

Немного не в тему, но вот скрипт, упрощенные версии которого я предлагал выше (принимает параметр %S)

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

<?xml version="1.0" standalone="yes" encoding="utf-8"?>
<job id="ren" version="0.4">
  <object id="f" progid="Scripting.FileSystemObject" />
  <script type="text/jscript" language="JScript"><![CDATA[
    var n=[],o;
    for(var i=0;i<WScript.Arguments.length;i++){
      o=fo(WScript.Arguments(i));
      if(o&&fm(o))fr(o,fo(n[n.length-1]));
    }
    function fm(e){
      var t=fn(e);
      if(n.join('?').match(e.name))return false;
      else n[n.length]=t;
      return true;
    }
    function fn(e){
      var t=e.name;
      if(t.substring(t.length-4)=='.bak')return(t.substring(0,t.length-4));
      else return(t+'.bak');
    }
    function fo(e){
      if(f.fileExists(e))return(f.getFile(e));
      else if(f.folderExists(e))return(f.getFolder(e));
      else return false;
    }
    function fr(x,y){
      if(y){
        var r=Math.random(),t=x.name;
        x.name=r;
        y.name=t;
      }x.name=n[n.length-1];
    }
  ]]></script>
</job>
Переименовывает файлы/папки добавляя (или убирая, если уже есть) расширение .bak. Особенности:
1. Допустим, есть два файла name и name.bak - скрипт поменяет их местами во всех трёх случаях: а). если передать ему name; б). если передать name.bak и в). если передать оба файла (двойного переименования не будет).
2. Допустим, есть папка name и файл name.bak - скрипту пофиг, где файл, а где папка, всё равно переименует (поменяет имена местами) и то, и другое.
Область применения - переточка проектов из нескольких связанных файлов, например, русификация (но не только). Если изменённые файлы/папки имеют неизменённые backup (bak) копии, можно быстро переключаться между двумя вариантами: выделяем файлы по расширению .bak и выполняем скрипт.
Iori
Сообщения: 552
Зарегистрирован: Ср апр 25, 2012 20:33

Сообщение Iori »

Serge Yolkin

Сегодня попробовал ваш скрипт на роботе. Как я и думал, админы перекрыли это дело и скирт не запустился.

Поэтому просьба кнопки ещё в силе.

Кнопка Flasher-а роботает хорошо, но она не меняет папки и не переводит названия файлов и папок обратно.
Ответить