Автозамена части строки в XML на имя родительского каталога

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

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

Cyrus
Сообщения: 11
Зарегистрирован: Вт апр 12, 2011 14:48
Откуда: РФ

Автозамена части строки в XML на имя родительского каталога

Сообщение Cyrus »

Здравствуйте. Прошу прощения за невнятное название темы - не смог написать покороче. Существует следующая задача:
В каталоге существует множество (20-200) подкаталогов. В каждом из них находятся какие-то файлы изображений (их трогать не надо) и один текстовый файл с расширением xml.
В этом текстовом файле необходимо найти и изменить некоторый набор символов (одинаковый у всех файлов xml) на название подкаталога, этот файл содержащего.

Везде обыскался, но решения найти не смог (кроме ковыряния вручную).
Подскажите, пожалуйста, какой-нибудь выход.

Заранее спасибо.


P.S. Смотрел здесь: Замена кусков текста в выделенных файлах, но мало чего понял.

[mod="Avada"]Оформил название смежной темы как нормальную ссылку. А прежний заголовок"Поиск и замена текста в выделенных файлах по списку" заменён другим, чтобы как раз не было путаницы с прежней темой.[/mod]
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Cyrus
Помимо указанной темы есть ещё ряд других, где приведены все рабочие варианты. Чтобы что-то понять по работе того или иного скрипта, надо в той же теме расписать последовательность действий, что получается, что нет. Если не ясно как работать со скриптами, кнопками и командами, то опять же ищем информацию по форуму, подобных вопросов было очень много. Ко всему прочему есть более десятка известных мне приложений, поддерживающий регэкспы и рекурсию, которые с лёгкостью с данной задачей справятся, но в любом случае надо расписать набор символов для поиска и замены.
Cyrus
Сообщения: 11
Зарегистрирован: Вт апр 12, 2011 14:48
Откуда: РФ

Сообщение Cyrus »

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

Сообщение Flasher »

Cyrus писал(а):в котором можно в поле замены задавать имя файла?
Так, стоп. Задавать автоматически или самостоятельно, как любой текст?
Cyrus
Сообщения: 11
Зарегистрирован: Вт апр 12, 2011 14:48
Откуда: РФ

Сообщение Cyrus »

Автоматически.
То есть, выглядит вот так:
Изначально:

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

папка1\MI.xml (в нём есть выражение "просто_папка")
папка2\MI.xml (в нём есть выражение "просто_папка")
...
папкаN\MI.xml (в нём есть выражение "просто_папка")
Должно получиться

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

папка1\MI.xml (в нём выражение "просто_папка" заменено на "папка1")
папка2\MI.xml (в нём выражение "просто_папка" заменено на "папка2")
...
папкаN\MI.xml (в нём выражение "просто_папка" заменено на "папкаN")
Хотелось бы, чтобы поиском Alt+F7 находились нужные xml-файлы, а потом с ними можно было бы произвести не очень хитрые манипуляции (как при пакетном переименовании, к примеру).
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Если есть рекурсия и маска, то поиск не требуется.
Не понятно зачем это в виде кода приводить, но суть была ясна.
Похоже тут всё-таки придётся подправлять один из существующих скриптов. Программы, где в качестве аргумента можно подбирать имена родидельских каталогов, может и есть, но я пока таких не припомню. В-общем, ждём у кого как со временем - результат точно будет. :wink:
Cyrus
Сообщения: 11
Зарегистрирован: Вт апр 12, 2011 14:48
Откуда: РФ

Сообщение Cyrus »

Большое спасибо за положительную реакцию. Честно говоря, боялся, что отправят с прямо порога без объяснений.
Аватара пользователя
Lev
Сообщения: 392
Зарегистрирован: Ср мар 02, 2005 16:34

Сообщение Lev »

Попробуй

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

'replaceinfiles.vbs
'Lev

'Параметры вызова
'wscript.exe "Диск:\Путь к скрипту\replaceinfiles.vbs"
'%P%S

Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")

Set args = WScript.Arguments

texttoreplace="просто_папка"

For Each f In args
  If fso.GetFile(f).Size<>0 Then
    Set ts = fso.GetFile(f).OpenAsTextStream(1, 0)
    st=ts.ReadAll
    ts.Close
    counter = 0
    If InStr(st, texttoreplace) Then
      counter = counter + 1
      '---бакап файла на всякий случай, закомментируй если не нужен
      fso.CopyFile f, fso.GetAbsolutePathName(f) & ".bak"
      
      Set ts = fso.GetFile(f).OpenAsTextStream(2, 0)
      ts.Write(Replace(st, texttoreplace, fso.GetFile(f).ParentFolder.Name))

      ts.Close
    End If
   End If
Next
Msgbox "Готово, кол-во найденных файлов - " & counter
Последний раз редактировалось Lev Вт апр 19, 2011 15:55, всего редактировалось 2 раза.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Lev писал(а):texttoreplace="просто_папка"
Тут бы надо какой-то общий критерий.
+%L, +рекурсия по выделенным папкам. Конечно, можно Ctrl+B и фильтр по *.xml, но всё же было бы удобней работать с выделенными каталогами. Сейчас гляну рабочие варианты.
Cyrus
Сообщения: 11
Зарегистрирован: Вт апр 12, 2011 14:48
Откуда: РФ

Сообщение Cyrus »

Lev
Спасибо за скрипт. Я его испробовал следующим образом.
Скопировал присланный Вами код в файл "replaceinfiles.vbs"
Заменил в нем "просто_папка" на "Хлупикино" (это и есть тот текст, который нужно заменить в xml на название родительских папок).
Сделал кнопочку

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

TOTALCMD#BAR#DATA
wscript.exe "C:\Program Files\Total Commander\Utils\replaceinfiles.vbs
%P%S
C:\Program Files\Total Commander\Utils\allteamstrms_rep.ico

C:\Program Files\Total Commander\Utils\

-1
Нашёл и выделил файлы в папках через Ctrl+B
Нажал на эту кнопочку.
Появилось сообщение от Windows Script Host "Недопустимый путь".
Тестовые папки лежат по адресу: "C:\downloads\test\", то есть путь вроде допустимый.
Названия папок -
Боброво
Журы
Смыки
и т.д.
Не знаю, важно ли это, но в названиях папок будут пробелы, точки и дефисы.

Скажите, пожалуйста, что я делаю не так?
Аватара пользователя
Lev
Сообщения: 392
Зарегистрирован: Ср мар 02, 2005 16:34

Сообщение Lev »

не вижу замыкающей кавычки в опциях кнопки - wscript.exe "C:\Program Files\Total Commander\Utils\replaceinfiles.vbs

потестировал на русских именах, пробелах и т.п. - у меня работает.
Cyrus
Сообщения: 11
Зарегистрирован: Вт апр 12, 2011 14:48
Откуда: РФ

Сообщение Cyrus »

Lev
Добавил кавычку (не дописал, простите).
Ошибку теперь не выдаёт, но в xml ничего всё равно не изменяет.
Lev, а можно Вам кинуть содержимое файла xml? Вы не могли бы у себя на нём проверить?
Аватара пользователя
Lev
Сообщения: 392
Зарегистрирован: Ср мар 02, 2005 16:34

Сообщение Lev »

координаты в личке
--------------
На присланных файлах у меня всё работает.

Начинаем фантазировать:
Достаточно ли свежа версия Total Commander'а, чтобы поддерживать параметры %P%S?
Слово "Хлупикино" в скрипте написано без опечаток? (Надеюсь был Copy-Paste.)
Помогает ли переключение клавиатурной раскладки на русский перед запуском скрипта?
Соответствует ли путь Start path в параметрах скрипта реальному пути к скрипту? (В приведённом образце кнопки соответствует, но вдруг?) Что если закавычить Start path? Удалить его совсем?
Cyrus
Сообщения: 11
Зарегистрирован: Вт апр 12, 2011 14:48
Откуда: РФ

Сообщение Cyrus »

Lev,
Попробовал то, что Вы написали.
Версия 7.50 (в её хелпе эти параметры упоминаются).
Раскладку менял (английский-русский) - не помогает.
"Путь запуска" проверил. "Закавычивал" и удалял - всё равно ничего не происходит.
Может быть, я не правильно его запускаю?
Я выделяю папки; нажимаю Ctrl+B; выделяю все файлы xml; жму на кнопочку скрипта.
При этом никаких сообщений не выдаётся, ничего не изменяется.
"Хлупикино" - менял на "abcdefg" в скрипте и в тестовых XML. Такой же результат.
P.S. Бэкапы тоже не создаются.
P.P.S. Вы не могли бы прислать Вашу кнопочку?
Cyrus
Сообщения: 11
Зарегистрирован: Вт апр 12, 2011 14:48
Откуда: РФ

Сообщение Cyrus »

Lev,
А может быть такое, что wsсript.exe некорректно работает? Как это проверить?
Ответить