Page 1 of 3

Пакетное изменение кодировки файлов

Posted: Thu Oct 28, 2010 5:15 pm
by Instructor
Существует несколько способов:

Способ 1.
- Открываем все файлы для перекодирования в AkelPad'е с режимом MDI/PMDI. Удобно найти интересующие файлы в файловом менеджере (Проводник, Total Commander и т.д.) и затем файлы из найденного списка перетащить в окно AkelPad'а.
- Затем "Главное меню->Файл->Сохранить все как...".
- Минусы: весьма ресурсоемкая процедура, если файлов много и они не маленькие.

Способ 2.
Скрипт OpenSaveMask.js.

Пример кнопки Total Commander'а для конвертирования выделенных файлов в UTF-8:
Название: Конвертировать в UTF-8
Команда: AkelPad.exe
Параметры:

Code: Select all

/Call("Scripts::Main", 1, "OpenSaveMask.js", `-OpenList="%L" -SaveDir="%T" -SaveCodepage=65001 -SaveBOM=1`)
Также отметим галочку "запускать в свернутом виде".

DropConverter.cmd - конвертирование переданных файлов в UTF-8:

Code: Select all

::Batch drop convertor. Usage - drag'n'drop files on this batch file via Windows Explorer.
@ECHO OFF
if [%1]==[] goto :EOF

set save_codepage=65001
set save_bom=1
set tempfile=AkelConvert.lst

::Call to EvalCmdEsc.js - create list from passed files to command line.
::Call to OpenSaveMask.js - convert files in list.
start /MIN AkelPad.exe ^
/Call("Scripts::Main", 1, "EvalCmdEsc.js", `var pArgs='%*'; pArgs=pArgs.replace(/[ ]?"(.*?)"%%%%7C[ ]/g, "$1%%%%5Cn"); AkelPad.Command(4101); AkelPad.ReplaceSel(pArgs); AkelPad.SaveFile(0, "%temp%\%tempfile%", 65001, 1); AkelPad.Command(4324);`) ^
/Call("Scripts::Main", 1, "OpenSaveMask.js", `-OpenList="%temp%\%tempfile%" -SaveDir="" -SaveCodepage=%save_codepage% -SaveBOM=%save_bom%`)
Способ 3.
Cmd файл для пакетного изменения кодировки файлов для режимов MDI/PMDI, с включенной опцией "Не открывать программу дважды".

Code: Select all

::Command line files convertion (MDI/PMDI).
@ECHO OFF

::If open_codepage == -1, then autodetect codepage.
::If open_bom == -1, then autodetect bom.
set open_mask=c:\My Folder\*.txt
set open_codepage=-1
set open_bom=-1
set save_codepage=65001
set save_bom=1

start AkelPad.exe /C- /B- /L+
for /F "delims=" %%a in ('dir "%open_mask%" /B /S /A-D') do (
  echo "%%a"
  AkelPad.exe "/OpenFile('%%a', %open_codepage%, %open_bom%)" "/SaveFile('%%a', %save_codepage%, %save_bom%)" "/Command(4324)"
)
AkelPad.exe /quit
echo "---DONE---"
PAUSE

Posted: Tue Nov 02, 2010 9:10 pm
by AlexShu
Что поменял следующие значения

Code: Select all

set open_mask=E:\_Progs0\Notepads\AkelPad4_TC\channels\*.*
set open_codepage=65001
set open_bom=0
set save_codepage=1251
set save_bom=0
Всё остальное оставил как есть. Но программа не работает.
Пишет

Code: Select all

"а" не является внутренней или внешней командой, исполняемой программой или пакетным файлом.
Запускал из дериктории AkelPad'a (E:\_Progs0\Notepads\AkelPad4_TC)
В чём причина не работы?

Win XP Pro sp2
AkelPad 4.5.0

Posted: Tue Nov 02, 2010 11:36 pm
by FeyFre
Instructor
Моя попытка натравить Ваш батничек заканчивается ещё плачевнее.
Акел вроде бы делает что сказано(время модификации файла меняется, но внутри вроде бы норм), но для каждого вызова выскакивает вот такое вот окно(не все сразу, а по очереди: это закрыл, следующее выглянуло):
Image
Владелец окна - процесс csrss.exe И делает он это очень много раз(но Акел в фоне работает исправно).
Поэкспериментировал и понял: просто start AkelPad.exe .... в цикле маловато будет. По такой причине:
Когда они запускаются, первый запускается, следующие при запуске обращаются к первому, по очереди(причем нету гарантий те, кого запустили раньше обработается первым, по отпечаткам времени файлов проверил). Так как операции выполняются не моментально, то очередь процессов растет. А ОС ну может слишком много процессов держать, потому одна из главных шишек винды - csrss.exe и посылала те процессы которые не могла переварить(А в моём случае выдержала очередь в 385 процесса(живих, остальные зомбились, максимум по 2 мб памяти себе отвоевывали) +/- 20 шт системных. Я натравил скрипт на мануал по php - 7683 файла). А рассасывается оочень медленно(у меня в зависимости от размеров обрабатываемых файлов(2-60кб) 200-350кб обработанных текстов в минуту.) Цифры скорее всего зависят от производительности машины и настроек Акела(кол-ва подгруженных плагинов - занятой памяти).

Нужно паузу после start поставить. Сказал бы миллисекунд на 40, не меньше.

Posted: Wed Nov 03, 2010 2:55 am
by Instructor
AlexShu
Попробуйте обновленную версию скорее всего дело было в отсутствующих кавычках.

FeyFre
Обновил пример. Сейчас должно быть и быстрее, и без проблем с количеством процессов.

Добавил информацию, что данный пример для режимов MDI/PMDI.

Posted: Wed Nov 03, 2010 7:55 am
by FeyFre
Instructor
Ну Акел собственно и был в PMDI, и "Не открывать дважды" тоже включено было. Впрочем вечером попробую новую версию, отпишусь.

Posted: Wed Nov 03, 2010 7:30 pm
by AlexShu
Instructor
Большое спасибо. Пока всё работает.

Только нельзя ли сделать так чтобы AkelPad грузился свёрнутым, а то это мигание раздражает.

Под миганием я подразумеваю: закрытие документа с белым фоном -> появление серого фона самого AkelPad'a -> загрузка документа с белым фоном.

Стоят галки "Не открывать программу дважды" и "Многооконный (MDI)"

Posted: Wed Nov 03, 2010 7:42 pm
by Instructor
AlexShu
Чтобы скрыть окно AkelPad'а, строку:

Code: Select all

start AkelPad.exe /C- /B- /L+
заменяем на

Code: Select all

start AkelPad.exe /C- /B- /L+ /Call("Scripts::Main", 1, "EvalCmd.js", `'AkelPad.SystemFunction().Call("user32::ShowWindow", AkelPad.GetMainWnd(), 0 /*SW_HIDE*/);'`)
Но тогда в случае какой-либо критической ошибки, вы не увидите сообщения, т.к. окно AkelPad'а будет скрыто. И свернуть пока не получится, т.к. AkelPad выходит на передний план при загрузке файла.

пакетное перекодирование текстовых файлов

Posted: Sun Apr 24, 2011 12:53 pm
by bvb
Возможен ли сабж с помощью akelpada?
Поясню. Есть куча текстовых файлов в разных кодировках. Надо все их перевести в одну (1251). Открывать файлы по очереди и сохранять в нужной кодировке можно, но очень неудобно и долго.
Может быть, можно как-то командной строкой это сделать?

Posted: Sun Apr 24, 2011 2:41 pm
by FeyFre
Читаем документацию http://akelpad.cvs.sourceforge.net/view ... lp-Rus.htm

Posted: Sun Apr 24, 2011 4:14 pm
by Instructor
bvb
См. первое сообщение темы.

Posted: Wed Feb 06, 2013 9:15 pm
by VladSh
Instructor
Сейчас есть возможность зарегистрировать AkelPad в системе, как раньше. Может можно как-то переписать скрипт, чтобы когда зарегена, не открывать программу вообще?

Posted: Thu Feb 07, 2013 9:06 am
by Instructor
VladSh
Плагин Scripts в режиме ActiveX не поддерживает методы AkelPad.OpenFile, AkelPad.ReadFile, AkelPad.SaveFile - см. Scripts-Rus.txt.

Posted: Thu Feb 07, 2013 9:41 am
by VladSh
Instructor
Ограничение по безопасности?

Posted: Thu Feb 07, 2013 9:55 am
by FeyFre
VladSh, ограничения по сути. Указанные функции запускают функции самого АР. А если оного нету, то что им тогда делать?

Posted: Thu Feb 07, 2013 11:58 am
by VladSh
FeyFre
Для FileSystemObject.GetFile(fileName) ненужно никакого окна. Методы можно подкорректировать так, чтобы при отсутствии окна файл открывался/сохранялся. Естественно, методы, работающие через UI (GetSelText, ReplaceSel и т.п.) не будут работать, но могут работать GetTextRange, и так в BackEnd'е вполне можно менять и сохранять файлы, используя мощь функционала AkelPad'а.
Почему нет? Не вижу тут ничего плохого или нереализуемого.

И это не только ActiveX касается. Можно добавить параметр для командной строки загружать/не_загружать окно, и тогда универсально буит работать, даже без ActiveX.