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

Russian main discussion
  • Author
  • Message
Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

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

Post 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
Last edited by Instructor on Thu Feb 07, 2013 9:19 am, edited 28 times in total.

Offline
Posts: 4
Joined: Tue Dec 29, 2009 4:29 am

Post 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

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

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

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

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

AlexShu
Попробуйте обновленную версию скорее всего дело было в отсутствующих кавычках.

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

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

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Instructor
Ну Акел собственно и был в PMDI, и "Не открывать дважды" тоже включено было. Впрочем вечером попробую новую версию, отпишусь.

Offline
Posts: 4
Joined: Tue Dec 29, 2009 4:29 am

Post by AlexShu »

Instructor
Большое спасибо. Пока всё работает.

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

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

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

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post 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 выходит на передний план при загрузке файла.

bvb
Offline
Posts: 1
Joined: Sun Apr 24, 2011 12:49 pm

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

Post by bvb »

Возможен ли сабж с помощью akelpada?
Поясню. Есть куча текстовых файлов в разных кодировках. Надо все их перевести в одну (1251). Открывать файлы по очереди и сохранять в нужной кодировке можно, но очень неудобно и долго.
Может быть, можно как-то командной строкой это сделать?

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Читаем документацию http://akelpad.cvs.sourceforge.net/view ... lp-Rus.htm

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

bvb
См. первое сообщение темы.

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Instructor
Сейчас есть возможность зарегистрировать AkelPad в системе, как раньше. Может можно как-то переписать скрипт, чтобы когда зарегена, не открывать программу вообще?

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

VladSh
Плагин Scripts в режиме ActiveX не поддерживает методы AkelPad.OpenFile, AkelPad.ReadFile, AkelPad.SaveFile - см. Scripts-Rus.txt.

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Instructor
Ограничение по безопасности?

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

VladSh, ограничения по сути. Указанные функции запускают функции самого АР. А если оного нету, то что им тогда делать?

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

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

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