Pull to refresh

Немного о том, как JavaScript include JavaScript

Reading time 6 min
Views 7.4K
Здравствуйте, Друзья.

Всё новое — хорошо забытое старое!
Речь пойдёт НЕ О HTML/JavaScript, а только о JavaScript!
Искал эту тему на Хабре, но не нашёл…

Работаю системным администратором в своей компании (домен windows) и поэтому часто приходится писать различные скрипты. За время работы была сделана библиотека функций (от .prototype, до WMI), которые вечно приходилось таскать за собою из файла в файл, что очень напрягает и утяжеляет код. Очень неприятно, когда начинаются модификации библиотечных функций (так же написанных на JavaScript). Вот тогда приходится искать где эта функция уже использовалась? Процесс поиска — утомительный, да ещё и отладкой нескольких файлов попахивает. Вот тогда и всплыло в моей памяти, что несколько лет назад читал где-то на форуме (уже за давностью лет и забылось на каком), что есть возможность делать такие «include».

Называется такая возможность .WSF. Технология древняя, как меловой период. Когда пишешь один .js, то этой технологии кажется много и не хочется свой код усугублять невнятным xml, но как только вспоминаешь, что вот функцию бы из «того» скрипта, добавить в «этот», так без этой технологии не обойтись.
Вот хорошее описание: http://www.osp.ru/win2000/2007/08/4684940/

От себя хочу добавить, что сразу поубавился объём кода, когда в начале файлов .wsf появилась запись:
<?xml version="1.0" encoding="UTF-8"?>
<package>
  <job id="id01">
    <script language="JScript" src="\\server03\install\AdminScripts\frameWork.js"/>
    <script language="JScript">
      <![CDATA[// Сюда пишем свои функции...
]]>
    </script>
  </job>
</package>


Кроме того можно делать «include» не только JavaScript, но и VBScript.

Но при этом возникла другая проблема. Хочется подсветки синтаксиса js/vbs, а ведь ни один редактор не умеет разбирать формат .wsf, поскольку там перемешаны xml, javascript/vbscript. Нда, иногда приходится удивляться, как работать с хорошей технологией приходится через блокнот. Уже смирившись с таким способом редактирования wsf-файлов вдруг обнаружил, что не я один был озабочен такой проблемой!!! И оказалось, что для этого нашлись умные ребята и написали отличный редактор:
Script Editor (trial, но...)
У него есть хорошие возможности: подобие intellisense (подсвечивает путь к файлу, из которого через «include» взялась функция, например, по ctrl-Space), возможность запускать программу прямо из окна редактора (кто использует scriptomatic — оценит: взял код из скриптоматика, вставил его в этот редактор и вперёд — на доработку). Встроенный хелп на объекты WScript, WshNetwork и пр. нужные объекты.
Минусом в этом редакторе я обнаружил только отсутствие интеллектуальных отступов и практически полное отсутствие настроек текстового редактора. Зато несомненным плюсом было то, что вместо табуляции пишутся четыре пробела (это на мой вкус, уж очень мне четыре пробела по душе!).

Вот пример:
Функции, которые я запишу в файл frameWork.js, а файл размещу в каталоге "\\server03\install\AdminScripts\frameWork.js".
// Вывод сообщения на экран (чтобы не писать часто WScript.Echo() ):
// Чтобы подавить вывод эха нужно просто установить эту переменную в false.
// Очень удобно по окончании процесса отладки, чтобы ничего не выводить.
var boolShowEchoFunction=true;
function echo(str)
{
   if(boolShowEchoFunction==false)
   {
      return;
   }
    if(typeof(window)!='undefined')
    {
      window.alert(str);
    }
    if(typeof(WScript)!='undefined')
    {
      WScript.Echo(str);
    }
}

// Открыть файл и сохранить в нём строку (пишу много логов в текстовые файлы):
function appendStrToFile(fileName, strData)
{
   try
   {
     var fso = WScript.CreateObject("Scripting.FileSystemObject");

     // Разложить путь на составляющие и проверить, есть ли каталог, в который нужно писать файл:
     var arrPath = new Array();
         fileName = fileName.replace(/[\/]+/gi, "\\").replace(/^\\\\/, "//").replace(/\\/gi,"\n").replace(/^\/\//gi, "\\\\");
         arrPath = fileName.split("\n");
     // Пройтись по пути и проверить наличие каждого каталога:
     var fileName = arrPath[0];
     var n=0;
         for(n=1;n<=arrPath.length-2;n++)
         {
            fileName+="\\"+arrPath[n];
            if( !fso.FolderExists(fileName) )
            {
                 fso.CreateFolder(fileName);
            }
         }
         fileName += "\\"+arrPath.last();
         if(!fso.FileExists(fileName))
         {
             var file = fso.CreateTextFile(fileName);
                 file.Close();
         }
     var f = fso.GetFile(fileName);
     var file = f.OpenAsTextStream(ForAppending, TristateTrue);
         file.Write(strData);
         file.Close();
   }
   catch(e)
   {
     echo("Ошибка записи:\nappendStrToFile("+fileName+", "+strData+"):\n"+e.description+", \n" );
   }
   return;
}

// Получить строку с сегодняшней датой (выровненной нулями):

function getStrToday()
{
   var now = new Date();
   var strNowDate = now.getYear()+"-"+( (now.getMonth()+1) <= 9 ? "0" : "")+(now.getMonth()+1)+"-"+(now.getDate() <= 9 ? "0" : "")+now.getDate();
   return strNowDate;
}

function getStrTime()
{
   var now = new Date();
   var strNowTime = (now.getHours() <= 9 ? "0" : "")+now.getHours()+":"+(now.getMinutes() <= 9 ? "0" : "")+now.getMinutes()+":"+(now.getSeconds() <= 9 ? "0" : "")+now.getSeconds();
   return strNowTime;
}

// Вернуть время с точностью до миллисекунды.
function getStrTimeM()
{
   var now = new Date();
   var strNowTime = (now.getHours() <= 9 ? "0" : "")+now.getHours()+":"+(now.getMinutes() <= 9 ? "0" : "")+now.getMinutes()+":"+(now.getSeconds() <= 9 ? "0" : "")+now.getSeconds()+":"+(now.getMilliseconds() <= 99 ? now.getMilliseconds() <= 9 ? "00" : "0" : "")+now.getMilliseconds();
   return strNowTime;
}




Пришла пора воспользоваться библиотекой.
Скрипт записывает в файл имя компьютера на котором запустили этот скрипт (запишем файл в путь "\\server03\install\AdminScripts\powerOnToFile.wsf"):
<?xml version="1.0" encoding="UTF-8"?>
<package>
  <job id="id01">
    <script language="JScript" src="\\server03\install\AdminScripts\frameWork.js"/>
    <script language="JScript">
      <![CDATA[// Регистрировать событие входа
function logonToFile()
{
       WshShell = WScript.CreateObject("WScript.Shell");
       WshNetwork = WScript.CreateObject("WScript.Network");

   var maxLen = 0;
   var now = new Date();
   var fileName = "\\\\server03\\Файлы\\log\\powerOn\\"+getStrToday()+"\\powerOn-["+WshNetwork.ComputerName+"]["+getStrToday()+"]"; // Суффикс файла, в который будет сливаться инфа.
   var strNowDate = getStrToday();
   var strNowTime = getStrTime();
       appendStrToFile( fileName+".txt", "\r\n["+strNowDate+"]["+strNowTime+"]["+WshNetwork.ComputerName+"]");
}
logonToFile();
]]>
    </script>
  </job>
</package>

Через Active Directory в GPO->Конфигурация компьютера->Конфигурация Windows->Сценарии Запуск/Завершение->Автозагрузка->«cscript.exe»,"\\server03\Install\AdminScripts\powerOnToFile.wsf"

Теперь я знаю, что компьютер сегодня был включён.

Второй скрипт определяет логин пользователя на компьютере, на котором запущен этот скрипт:
(запишем файл в путь "\\server03\install\AdminScripts\logonToFile.wsf"):

<?xml version="1.0" encoding="UTF-8"?>
<package>
  <job id="id01">
    <script language="JScript" src="\\server03\install\AdminScripts\frameWork.js"/>
    <script language="JScript">
      <![CDATA[// Регистрировать событие входа
function logonToFile()
{
       WshShell = WScript.CreateObject("WScript.Shell");
       WshNetwork = WScript.CreateObject("WScript.Network");

   var maxLen = 0;
   var now = new Date();
   var fileName = "\\\\server03\\Файлы\\log\\powerOn\\"+getStrToday()+"\\powerOn-["+WshNetwork.ComputerName+"]["+getStrToday()+"]"; // Суффикс файла, в который будет сливаться инфа.
   var strNowDate = getStrToday();
   var strNowTime = getStrTime();
       appendStrToFile( fileName+".txt", "\r\n["+strNowDate+"]["+strNowTime+"]["+WshNetwork.ComputerName+"]");
}
logonToFile();
]]>
    </script>
  </job>
</package>


Через Active Directory в GPO->Конфигурация пользователя->Конфигурация Windows->Сценарии Запуск/Завершение->Автозагрузка->«cscript.exe»,"\\server03\Install\AdminScripts\logonToFile.wsf"
Теперь, когда пользователи включают с утра компьютеры и логинятся на них, то в каталог
\\server03\\Файлы\\log
записываются файлы с нужной мне информацией, что компьютер включался и что пользователь заходил на определённый компьютер с определённым логином. Как видим, в обоих файлах использовались функции echo() и appendStrToFile(), getStrToday(), которые были взяты из библиотечного файла frameWork.js

Теперь у меня, как у администратора есть информация, какие компьютеры сегодня включались и на какие входили пользователи.

Надеюсь, что такая простая технология с этим редактором может принести кому-то огромную пользу.
Tags:
Hubs:
+2
Comments 4
Comments Comments 4

Articles