Отправляет email-рассылки с помощью сервиса Sendsay

Программирование на JavaScript

  Все выпуски  

JavaScript (JScript), PHP, Perl - полезные советы


Информационный Канал Subscribe.Ru


Азы и секреты программирования на JavaScript
JScript, PHP, Perl - полезные советы.
N 1

Архив предыдущих выпусков: http://subscribe.ru/
Форум по скриптовым языкам: http://www.script-info.net/phorum/

Смена названия рассылки.

В самом начале выпуска хочу поблагодарить Всех подписчиков, остающихся верными рассылке. Но у меня для Вас новость. Рассылка сменила название. Причина в том, автор (ваш покорный слуга) сменил профиль работы. Не буду утруждать вас деталями, скажу только, что информация по JScript по-прежнему будет присутствовать в рассылке. Просто теперь тематика рассылки расширилась, и я буду делиться опытом, накопленным при работе с другими языками программирования. Имеется ввиду PHP и Perl. Материалы, я думаю, будут интересны как пользователям Window, так и Unix систем. И конечно программистам, занимающимся веб-дизайном.

Пакетная обработка в WSH.

Если кто-то занимался веб-дизайном, то наверняка сталкивался с проблемой обработки большого количества файлов, когда необходимо найти определенный текст или фрагмент текста в определенной фразе и заменить его (как вариант - удалить). Например, при переносе сайта, или при изменении логической структуры сайта. Когда я решился перенести свой сайт script.net.ru в домен второго уровня script-info.net, дополнив его новой информацией, мне пришлось обрабатывать пакетным способом около 4 000 (четыре тысячи!) файлов, общим объемом около 20 мегабайт. Понятно, такую работу вручную не переделаешь и за год. Поэтому поневоле пришлось на время стать тестировщиком различных утилит поиска и замены текста.

Был "перерыт" интернет, скачано порядка 10 разных утилит и проведен конкурсный отбор. Проверка их работы в общих чертах показала, что победитель отсутствует! Если утилита интеллектуально работала с шаблонами, то она буквально "засыпала" на многие часы при обработке более тысячи файлов. Если она было достаточно резвой, то, как правило, не понимала языка шаблонов. Более того, ни одна найденная мной утилита не имела средств, чтобы дописать какой-то текст в начало или в конец файла (в пакетном режиме для группы файлов).

Пришлось открывать справочник по JScript и "ваять". В результате получился быстрый как стрела, и мудрый как Чингачгук код. Результат превзошел все ожидания, подтвердив силу WSH. То, над чем HomeSite (веб-редактор) и "Search & Replace" от InfoRapid (free утилита) трудились почти сутки, сделанная за час утилита выполнила быстрее чем за две минуты. Есть разница - двадцать часов и две минуты?

Вот вам текст программы:

Внимание!!! Сценарий не создает резервных копий изменяемых файлов, поэтому будьте очень аккуратны. Все ваши шаблоны тестируйте на временных файлах в отдельном каталоге. Иначе из-за простой невнимательности можете безвозвратно потерять ценную информацию.

////////////////////////////////////////////////////////////////////
//                                                                //
//           Поиск и замена текста в файлах                       //
//          Автор: Scripter (www.script-info.net)                 //
//                                                                //
////////////////////////////////////////////////////////////////////

var Новая_строка = "\r\n";
var Поиск_и_Замену = 0;
var Добавление_в_Начало = 1;
var Добавление_в_Конец = 2;

// Настройка утилиты
// =================
var Тип_Файлов="HTML"; // Вариант - "Файл 'PHP'" и т.д.
var Выполнить = Поиск_и_Замену; // Добавление_в_Начало | Добавление_в_Конец
var Каталог="c:\\web\\html";
var Шаблон_Поиска = /http:\/\/www\.script-info\.net\/\?rd=dhtml&rf=html\/htmltags\.php&part=/ig ;
// Если выбран режим "Добавление_в_..." тут пишем, что добавить:
var Заменить_На = "http://www.script-info.net/dhtml/html/htmltags.php?part=";

/* Регулярные выражения
справка на http://script-info.net/jsvbs/msscript/js56/js56jsgrpregexpsyntax.php
-------------------------
Спецсимволы, которые необходимо
экранировать в шаблоне поиска слэшем (\):
) ( . / ? ^ $ * + } { ] [

Краткая справка
-------------------------
^ начало строки
$ конец строки
* {0,} ноль и более раз
+ {1,} один и более
? {0,1} ноль или один
? после (*, +, ?, {n}, {n,}, {n,m}) обозначает
 "выбрать комбинацию минимальной длины"
 . любой символ кроме \n
[.\n] любой символ

параметры:
-------------------------
i игнорировать регистр при поиске
g искать все вхождения

примеры:
-------------------------

/^\[ \t]*$/g  поиск пустых строк

Windows (?=95|98|NT|2000) Соответствует слову "Windows" в фразе
   "Windows 2000" но не в фразе "Windows 3.1".
*/

//////////////////////////////////////////////////////////////////////
// Дальше что-либо менять нежелательно

var Счет = 0;
var Файлов = 0;
var ForReading = 1, ForWriting = 2, ForAppending = 8;
var TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0;
var WSHShell = WScript.CreateObject("WScript.Shell");
var fso = new ActiveXObject("Scripting.FileSystemObject");
CurrentFolder = Каталог;
ScanFolders(CurrentFolder);
WSHShell.Popup("Работа выполнена" + Новая_строка + Новая_строка +
    "Файлов изменено:\t" + Файлов + Новая_строка +
    "Число операций:\t\t" + Счет);

// Проверяем все вложенные подкаталоги
function ScanFolders(folderspec) {
//WSHShell.Popup(folderspec);
 var f, fc;
 SearchFiles(folderspec);
 f = fso.GetFolder(folderspec);
 fc = new Enumerator(f.SubFolders);
 for (; !fc.atEnd(); fc.moveNext())
 {
     NextFolder = fc.item();
     ScanFolders(NextFolder);
 }
}
// Получение списка файлов в каталоге
function SearchFiles(folderspec) {
   var f, fc, s;
   f = fso.GetFolder(folderspec);
   fc = new Enumerator(f.files);
   s = "";
   for (; !fc.atEnd(); fc.moveNext())
   {
      s = fc.item();
   CurrentType=FileType(s);
    if(CurrentType.search(Тип_Файлов)==0){
  switch (Выполнить) {
   case Поиск_и_Замену :
    FileModyfy(s);
    break;
   case Добавление_в_Начало :
    AppedBegin(s);
    break;
   case Добавление_в_Конец :
    AppedEnd(s);
    break;
  }
    }
   }
}
// получение типа файла
function FileType(filespec) {
   var f, s;
 if (fso.FolderExists(filespec)){
      f = fso.GetFolder(filespec);
 } else {
  if (fso.FileExists(filespec)) {
   f = fso.GetFile(filespec);
  } else {
   s = "Error: File or Folder does not find.";
  }
  s = f.Type;
 }
 //WSHShell.Popup (s);
 return(s);
}
// добавление строки в начало
function AppedBegin(currentFile) {
 FileHeader = currentFile.OpenAsTextStream(ForReading, TristateUseDefault);
 FileString = FileHeader.ReadAll();
 FileHeader.Close( );
 FileString = Заменить_На + FileString;
  FileHeader = currentFile.OpenAsTextStream(ForWriting, TristateUseDefault);
  FileHeader.Write(FileString);
  FileHeader.Close( );
 Файлов += 1;
 Счет += 1;
}
// добавление строки в конец
function AppedEnd(currentFile) {
 FileHeader = currentFile.OpenAsTextStream(ForReading, TristateUseDefault);
 FileString = FileHeader.ReadAll();
 FileHeader.Close( );
 FileString = FileString + Заменить_На;
  FileHeader = currentFile.OpenAsTextStream(ForWriting, TristateUseDefault);
  FileHeader.Write(FileString);
  FileHeader.Close( );
 Файлов += 1;
 Счет += 1;
}
// удаление/замена строки
function FileModyfy(currentFile) {
 FileHeader = currentFile.OpenAsTextStream(ForReading, TristateUseDefault);
 FileString = FileHeader.ReadAll();
 FileHeader.Close( );
 var tr = FileString.match(Шаблон_Поиска);
 if (tr)
 {
  Счет = Счет + tr.length;
  Файлов += 1;
 }
 FileString = FileString.replace(Шаблон_Поиска, Заменить_На);
  FileHeader = currentFile.OpenAsTextStream(ForWriting, TristateUseDefault);
  FileHeader.Write(FileString);
  FileHeader.Close( );
}

Внимание!!! Сценарий не создает резервных копий изменяемых файлов, поэтому будьте очень аккуратны. Все ваши шаблоны тестируйте на временных файлах в отдельном каталоге. Иначе из-за простой невнимательности можете безвозвратно потерять ценную информацию.

Если у вас возникнут вопросы по использованию данного сценария или по скриптам вобще, пожалуйста, не пишите мне на e-mail. Специально для этого есть форум, где мы вместе сможем найти нужные ответы на все ваши вопросы. Заходите, буду только рад.


Eсли Вы ищете качественный и недорогой web-хостинг, лично я рекомендую PeterHost.Ru. Российский, прекрасные каналы, сервис "на уровне".

Автор и ведущий рассылки И. Балезин
Лучший хостинг в Рунете

InterReklama Advertizing
Интерреклама. Интернет

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное