| View previous topic :: View next topic |
| Author |
Message |
Instructor Site Admin
Joined: 06 Jul 2006 Posts: 4640
|
Posted: Thu Oct 28, 2010 5:15 pm Post subject: Пакетное изменение кодировки файлов |
|
|
Существует несколько способов:
Способ 1.
- Открываем все файлы для перекодирования в AkelPad'е с режимом MDI/PMDI. Удобно найти интересующие файлы в файловом менеджере (Проводник, Total Commander и т.д.) и затем файлы из найденного списка перетащить в окно AkelPad'а.
- Затем "Главное меню->Файл->Сохранить все как...".
- Минусы: весьма ресурсоемкая процедура, если файлов много и они не маленькие.
Способ 2.
Скрипт OpenSaveMask.js.
Пример кнопки Total Commander'а для конвертирования выделенных файлов в UTF-8:
Название: Конвертировать в UTF-8
Команда: AkelPad.exe
Параметры: | Code: | | /Call("Scripts::Main", 1, "OpenSaveMask.js", `-OpenList="%L" -SaveDir="%T" -SaveCodepage=65001 -SaveBOM=1`) |
Также отметим галочку "запускать в свернутом виде".
DropConverter.cmd - конвертирование переданных файлов в UTF-8:
| Code: | ::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: | ::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 |
|
| Back to top |
|
 |
AlexShu
Joined: 29 Dec 2009 Posts: 4
|
Posted: Tue Nov 02, 2010 9:10 pm Post subject: |
|
|
Что поменял следующие значения
| Code: | 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: | | "а" не является внутренней или внешней командой, исполняемой программой или пакетным файлом. |
Запускал из дериктории AkelPad'a (E:\_Progs0\Notepads\AkelPad4_TC)
В чём причина не работы?
Win XP Pro sp2
AkelPad 4.5.0 |
|
| Back to top |
|
 |
FeyFre
Joined: 07 Aug 2007 Posts: 1889 Location: Vinnitsa, Ukraine
|
Posted: Tue Nov 02, 2010 11:36 pm Post subject: |
|
|
Instructor
Моя попытка натравить Ваш батничек заканчивается ещё плачевнее.
Акел вроде бы делает что сказано(время модификации файла меняется, но внутри вроде бы норм), но для каждого вызова выскакивает вот такое вот окно(не все сразу, а по очереди: это закрыл, следующее выглянуло):
Владелец окна - процесс csrss.exe И делает он это очень много раз(но Акел в фоне работает исправно).
Поэкспериментировал и понял: просто start AkelPad.exe .... в цикле маловато будет. По такой причине:
Когда они запускаются, первый запускается, следующие при запуске обращаются к первому, по очереди(причем нету гарантий те, кого запустили раньше обработается первым, по отпечаткам времени файлов проверил). Так как операции выполняются не моментально, то очередь процессов растет. А ОС ну может слишком много процессов держать, потому одна из главных шишек винды - csrss.exe и посылала те процессы которые не могла переварить(А в моём случае выдержала очередь в 385 процесса(живих, остальные зомбились, максимум по 2 мб памяти себе отвоевывали) +/- 20 шт системных. Я натравил скрипт на мануал по php - 7683 файла). А рассасывается оочень медленно(у меня в зависимости от размеров обрабатываемых файлов(2-60кб) 200-350кб обработанных текстов в минуту.) Цифры скорее всего зависят от производительности машины и настроек Акела(кол-ва подгруженных плагинов - занятой памяти).
Нужно паузу после start поставить. Сказал бы миллисекунд на 40, не меньше. |
|
| Back to top |
|
 |
Instructor Site Admin
Joined: 06 Jul 2006 Posts: 4640
|
Posted: Wed Nov 03, 2010 2:55 am Post subject: |
|
|
AlexShu
Попробуйте обновленную версию скорее всего дело было в отсутствующих кавычках.
FeyFre
Обновил пример. Сейчас должно быть и быстрее, и без проблем с количеством процессов.
Добавил информацию, что данный пример для режимов MDI/PMDI. |
|
| Back to top |
|
 |
FeyFre
Joined: 07 Aug 2007 Posts: 1889 Location: Vinnitsa, Ukraine
|
Posted: Wed Nov 03, 2010 7:55 am Post subject: |
|
|
Instructor
Ну Акел собственно и был в PMDI, и "Не открывать дважды" тоже включено было. Впрочем вечером попробую новую версию, отпишусь. |
|
| Back to top |
|
 |
AlexShu
Joined: 29 Dec 2009 Posts: 4
|
Posted: Wed Nov 03, 2010 7:30 pm Post subject: |
|
|
Instructor
Большое спасибо. Пока всё работает.
Только нельзя ли сделать так чтобы AkelPad грузился свёрнутым, а то это мигание раздражает.
Под миганием я подразумеваю: закрытие документа с белым фоном -> появление серого фона самого AkelPad'a -> загрузка документа с белым фоном.
Стоят галки "Не открывать программу дважды" и "Многооконный (MDI)" |
|
| Back to top |
|
 |
Instructor Site Admin
Joined: 06 Jul 2006 Posts: 4640
|
Posted: Wed Nov 03, 2010 7:42 pm Post subject: |
|
|
AlexShu
Чтобы скрыть окно AkelPad'а, строку:
| Code: | | start AkelPad.exe /C- /B- /L+ |
заменяем на
| Code: | | start AkelPad.exe /C- /B- /L+ /Call("Scripts::Main", 1, "EvalCmd.js", `'AkelPad.SystemFunction().Call("user32::ShowWindow", AkelPad.GetMainWnd(), 0 /*SW_HIDE*/);'`) |
Но тогда в случае какой-либо критической ошибки, вы не увидите сообщения, т.к. окно AkelPad'а будет скрыто. И свернуть пока не получится, т.к. AkelPad выходит на передний план при загрузке файла. |
|
| Back to top |
|
 |
bvb
Joined: 24 Apr 2011 Posts: 1
|
Posted: Sun Apr 24, 2011 12:53 pm Post subject: пакетное перекодирование текстовых файлов |
|
|
Возможен ли сабж с помощью akelpada?
Поясню. Есть куча текстовых файлов в разных кодировках. Надо все их перевести в одну (1251). Открывать файлы по очереди и сохранять в нужной кодировке можно, но очень неудобно и долго.
Может быть, можно как-то командной строкой это сделать? |
|
| Back to top |
|
 |
FeyFre
Joined: 07 Aug 2007 Posts: 1889 Location: Vinnitsa, Ukraine
|
|
| Back to top |
|
 |
Instructor Site Admin
Joined: 06 Jul 2006 Posts: 4640
|
Posted: Sun Apr 24, 2011 4:14 pm Post subject: |
|
|
bvb
См. первое сообщение темы. |
|
| Back to top |
|
 |
VladSh
Joined: 29 Nov 2006 Posts: 2509 Location: Киев, Русь
|
Posted: Wed Feb 06, 2013 9:15 pm Post subject: |
|
|
Instructor
Сейчас есть возможность зарегистрировать AkelPad в системе, как раньше. Может можно как-то переписать скрипт, чтобы когда зарегена, не открывать программу вообще? |
|
| Back to top |
|
 |
Instructor Site Admin
Joined: 06 Jul 2006 Posts: 4640
|
Posted: Thu Feb 07, 2013 9:06 am Post subject: |
|
|
VladSh
Плагин Scripts в режиме ActiveX не поддерживает методы AkelPad.OpenFile, AkelPad.ReadFile, AkelPad.SaveFile - см. Scripts-Rus.txt. |
|
| Back to top |
|
 |
VladSh
Joined: 29 Nov 2006 Posts: 2509 Location: Киев, Русь
|
Posted: Thu Feb 07, 2013 9:41 am Post subject: |
|
|
Instructor
Ограничение по безопасности? |
|
| Back to top |
|
 |
FeyFre
Joined: 07 Aug 2007 Posts: 1889 Location: Vinnitsa, Ukraine
|
Posted: Thu Feb 07, 2013 9:55 am Post subject: |
|
|
| VladSh, ограничения по сути. Указанные функции запускают функции самого АР. А если оного нету, то что им тогда делать? |
|
| Back to top |
|
 |
VladSh
Joined: 29 Nov 2006 Posts: 2509 Location: Киев, Русь
|
Posted: Thu Feb 07, 2013 11:58 am Post subject: |
|
|
FeyFre
Для FileSystemObject.GetFile(fileName) ненужно никакого окна. Методы можно подкорректировать так, чтобы при отсутствии окна файл открывался/сохранялся. Естественно, методы, работающие через UI (GetSelText, ReplaceSel и т.п.) не будут работать, но могут работать GetTextRange, и так в BackEnd'е вполне можно менять и сохранять файлы, используя мощь функционала AkelPad'а.
Почему нет? Не вижу тут ничего плохого или нереализуемого.
И это не только ActiveX касается. Можно добавить параметр для командной строки загружать/не_загружать окно, и тогда универсально буит работать, даже без ActiveX. |
|
| Back to top |
|
 |
|