Перейти на главную страничку сайта (список статей, файлы для скачивания)

ФОРУМ (здесь можно обсудить эту статью, а также любые проблемы программирования на различных макроязыках и в скриптовых средах)

Скриптовый язык KiXtart

KiXtart — это бесплатный язык сценариев с богатыми встроенными функциональными возможностями для лёгкого написания скриптов в Windows Vista, Server 2003, XP, 2000, NT, Windows 9x и MS-DOS. Он поддерживает COM (ADSI, ADO, WMI и т.д.) и таким образом легко расширяем. Начиная с версии 4.50 KiXtart поставляется с системой "pre-tokenization" для более быстрой загрузки и уменьшения сценариев, а также обеспечения некоторой защиты кода через обфускацию. Язык KiXtart имеет средства построения GUI — плагин KiXforms. На официальном сайте KiXtart выложено более 600 готовых к использованию пользовательских функций (UDF, User Defined Functions), написанных на языке KiXtart. Язык KiXtart разработан Ruud van Velsen (Microsoft, Нидерланды). На официальном сайте KiXtart имеется форум (англ.). Скачать документацию по KiXtart (англ.) можно здесь.

Проект KiXtart был начат в 1991 году как факультативный проект, решающий задачи логон-скриптинга в среде Microsoft LAN Manager (KiXtart обычно позиционируется как язык для системных администраторов, расширяющий возможности пакетных командных файлов). KiXtart изначально распространялся как freeware и был частью нескольких Microsoft Resource Kit. В течение долгого времени KiXtart набирал популярность и функциональные возможности. По мнению некоторых, KiXtart максимально удобен для решения задач логон-скриптинга по сравнению с другими языками, т.к. в самом языке в виде макросов или функций реализованы большинство вещей, которые требуются именно для подобных задач.

KiXtart не требует инсталляции, достаточно скопировать файлы в поставке. Для Windows NT/2000/XP в принципе достаточно одного исполняемого файла KIX32.exe (менее 300 Кб). В поставке вы найдёте около 20 примеров скриптов KiXtart, несколько примеров интеграции KiXtart с VBScript и VBA, а также несколько примеров музыкальных файлов KiXtart для встроенного динамика.

Основные возможности KiXtart:

Язык KiXtart регистронезависим. KiXtart позволяет создать в скрипте метки процедур для перехода, организовать циклы и ветвление различными способами, объявить пользовательские функции, подключать скрипты директивой include, работать с глобальными переменными, видимыми во всех скриптах в данной сессии интерпретатора. Язык KiXtart поддерживает динамические массивы. Как неприятность следует отметить корявую работу с русским языком в некоторых случаях.

С помощью встроенных команд KiXtart можно подать сигнал системным динамиком, вывести на консоль увеличенный псевдографический текст, запретить прерывание скрипта нажатием Ctrl+C/Break или закрытием окна консоли, вызвать другой KiXtart-скрипт, сменить текущий каталог и диск, очистить экран консоли, задать цвет фона и текста консоли, скопировать/переименовать файлы/каталоги с применением групповых символов (возможно рекурсивно), удалить файлы/каталоги, создать каталоги, динамически включить/выключить режим отладки, вывести на консоль содержимое текстового файла, организовать ввод данных от пользователя в консоли, проиграть WAV или специальный SPK файл системным динамиком, запустить команду системы с ожиданием завершения и без, установить переменные среды, синхронизировать часы локального компьютера, сделать паузу в исполнении скрипта, подключить/отключить/перечислить сетевые диски.

С помощью встроенных функций KiXtart можно:

С помощью встроенных макросов KiXtart можно получить много системной информации о пользователе (например, его имя и SID), компьютере (например, CPU, адрес сетевой карты и т.д.) окружении (текущая дата, операционная система, текущий каталог и т.д.).

Интерпретатор WKIX32.EXE позволяет выполнить сценарий, не отображая окно консоли. По умолчанию окно консоли появляется только в момент, когда осуществляется какой-то вывод на консоль. Ключ запуска /I позволяет полностью избавиться от окна консоли.

Полезные ресурсы по KiXtart:

Hello, World!

Сохраните следующий текст в файле test.kix:

/* многострочный
комментарий */
"Привет, KiXtart!" ; комментарий

Запустите скрипт командой наподобие следующей:

kix32.exe test.kix

Пример, демонстрирующий работу с переменными, командами, встроенными функциями и макросами KiXtart:

; функция SetConsole скрывает окно консоли:
SetConsole("HIDE")
; команда PLAY (звуки системного динамика):
PLAY "0g256t 0g8d247f 4d165f 247f 8d262f 4d165f 262f 8d277f 4d165f"
; функция SetConsole отображает окно консоли:
SetConsole("SHOW")
CLS ; команда CLS очищает консоль
/*******************************************************************/
; работа с переменными:
$One = 1
$Two = 2
BIG ; команда BIG выводит укрупнённую псевдографику
; вывод суммы с новой строки (символ "?"):
? "1+2=" $One + $Two
SLEEP 3 ; команда SLEEP делает паузу
CLS
SMALL ; команда SMALL возвращает нормальный вывод
/*******************************************************************/
"Сведения о системе" ?
; макросы содержат полезную информацию:
? "Идентификатор процесса KiXtart: " @PID
? "Тип Oперационной системы: " @PRODUCTTYPE
? "Имя компьютера: " @HOSTNAME
? "Признак терминальной сессии: " @TSSESSION
? "Пользователь: " @USERID ", " @SID
? ? "Работа завершена."

Пример использования функций и меток:

"1+2=" Sum(1, 2) ; пример вызова функции
$label = "myLabel" ; переход к метке
GOSUB $label
? "Завершение работы."
Return
/*********************************************************/
Function Sum ($arg1, $arg2)
    $res = $arg1 + $arg2
    $sum = $res ; возврат результата
EndFunction
/*********************************************************/
:myLabel
    ? "переход к метке myLabel"
Return

Пример, демонстрирующий работу с COM (ADSI, WMI, управление Excel), ветвление и циклы:

$root = GetObject("ADs:")
$root.Class
For Each $Elem In $root
    ? $Elem.Name
Next
/***********************************************/
$Drives = GetObject("winmgmts:").ExecQuery("select Name,DriveType from Win32_LogicalDisk")
If @error <> 0
    ? @error + " / " @serror
Else
    For Each $Drive In $Drives
        ? $Drive.Name
    Next
EndIf
/***********************************************/
$oXL = CreateObject("Excel.Application")
If @error = 0
    $oXL.Visible = 1
    $Rc = $oXL.Workbooks.Add
    $array = "Артикул", "Количество", "Процент"
    $oXL.Range("A1:C1").Value = $array
    For $i = 0 To 19
        $oXL.Cells(($i+2), 1).Value = "Арт" + ($i + 1000)
        $oXL.Cells(($i+2), 2).Value = rnd() / 100
    Next
    $oXL.Range("C2").Resize(20, 1).Formula = "=B2*0.07"
    $oXL.Range("A1:C1").Font.Bold = 1
    $Rc = $oXL.Range("A1:C1").EntireColumn.AutoFit
    $oXL.UserControl = 1
Else
    ? @error + " / " @serror
EndIf

Пример вывода цветом в консоли:

$DefaultColor = "w+/n+"
COLOR $DefaultColor CLS
AT(15, 20)
COLOR c+/b  "Я"        COLOR $DefaultColor " " SLEEP 1
COLOR y+/g  "умею"     COLOR $DefaultColor " " SLEEP 1
COLOR r+/y+ "рисовать" COLOR $DefaultColor " " SLEEP 1
COLOR g+/w+ "цветами"  COLOR $DefaultColor     SLEEP 3

Обфускация

KiXtart поддерживает так называемую pre-tokenize обработку сценариев, преобразовывая скрипт в набор нечитаемых символов. Обработанные таким образом сценарии меньше по размеру, несколько быстрее обрабатываются и содержат сигнатуру, защищающую от случайных изменений. Например:

KIX32 demo.kix /t /u=YourSecretPassword

Команда выше создаст нечитаемый скрипт demo.kx, защищённый паролем "YourSecretPassword" для запуска скрипта (защита паролем опциональна). Если kx-скрипт защищён паролем, он может быть запущен командой наподобие следующей:

KIX32 demo.kx /u=YourSecretPassword

При попытке "обычного" запуска будет выдано сообщение:

ERROR : script is password protected, please specify the password!

Если изменить в kx-скрипте хотя бы один символ, при попытке его запуска будет выдано сообщение:

ERROR : script [путь] is corrupt or the specified password is incorrect!

Команды INCLUDE и CALL позволяют комбинировать в сценариях pre-tokenized и обычные скрипты.

Обратное преобразование pre-tokenized скриптов не поддерживается.

Отладка

KiXtart поддерживает пошаговое исполнение сценария в режиме отладки (tokenized-скрипты не отлаживаются). Отладку можно включить и выключить командами DEBUG ON и DEBUG OFF в любом месте в коде скрипта. Ключ запуска /d эквивалентен команде DEBUG ON в начале скрипта.

В режиме отладки вверху окна консоли отображается текущий оператор сценария, а при необходимости — также значение определённой переменной или макроса. Управление в режиме отладки:

Построение GUI

Вы можете скачать бесплатный инструмент KiXforms Classic с этой страницы (размер около 1 Мб). Установка KiXforms сводится к регистрации COM-сервера kixforms.dll:

regsvr32 kixforms.dll

Простейший скрипт "Hello, World", выводящий на экран пустое окно с заголовком:

BREAK ON ; разрешение прерывания по Ctrl+C
$System = CreateObject("Kixtart.System")
$Form = $System.Form()
$Form.Text = "Привет, KiXforms Classic!"
$Form.Show
While $Form.Visible 
    $=Execute($Form.DoEvents) 
Loop 
Exit 0

Чуть более сложный пример GUI с обработкой событий. Окно с кнопкой, демонстрируется количество нажатий на кнопку:

Break On
$System = CreateObject("Kixtart.System")

$ClickText = "Число нажатий на кнопку: "
$ClickCount = 0

$Form = $System.Form()
$Form.Text = "Демонстрация KiXforms"
$Form.Width = 300
$Form.Height = 130
$Form.FontName = "Verdana"
$Form.FontSize = 12

$Label1 = $Form.Controls.Add("Label")
$Label1.Left = 35
$Label1.Top = 10
$Label1.Width = 270
$Label1.Height = 30
$Label1.Text = $ClickText + $ClickCount

$Button1 = $Form.Controls.Add("Button")
$Button1.Left = 35
$Button1.Top = 50
$Button1.Width = 230
$Button1.Height = 40
$Button1.Text = "Кнопка"
$Button1.OnClick = "Button1_Click()"

$Form.Center()
$Form.Show()

While $Form.Visible
    $ = Execute($Form.DoEvents)
Loop

Exit 0

Function Button1_Click()
    $ClickCount = $ClickCount + 1
    $Label1.Text = $ClickText + $ClickCount
EndFunction

Объект Kixtart.System позволяет осуществить "обезьяний патчинг", динамически создавая свойства объектов:

Break On
$System = CreateObject("Kixtart.System")
$Obj = $System.Object()
$Obj.myArbitraryProperty = "Строка данных"
$Obj.monkey = $Obj ; обезьяна
; вывод значения свойства:
$Obj.monkey.monkey.monkey.monkey.myArbitraryProperty

Вышеупомянутая возможность позволит создавать "конструкторы" объектов, а при желании также имитировать наследование свойств объектов. Пример такого конструктора:

Function MyObj(optional $Prop)
    $MyObj = $System.Object()
    $MyObj.pr = iif($Prop, $Prop, "")
EndFunction

$System = CreateObject("Kixtart.System")
$Obj = MyObj("данные")
$Obj.pr2 = "строка"
; вывод на консоль:
$Obj.pr ? $Obj.pr2

Ещё один пример GUI, демонстрирующий создание иконки в трее, организацию меню и обработку событий. После запуска скрипта появится иконка в трее, двойной щелчок по которой сделает видимым окно скрипта. Закрытие окна скрипта "системным" способом приводит к его сворачиванию в трей, а выход осуществляется только через его меню:

Break On
$System = CreateObject("Kixtart.System")

$Form = $System.Form()
$Form.Text = "Пример иконки в трее"
$Form.Icon = $System.BuiltinIcons(0)
$Form.OnResize = "Form_Resize()"

$FileMenu = $Form.Menu.MenuItems.Add("Файл")
$ExitMenu = $FileMenu.MenuItems.Add("Выход")
$ExitMenu.OnClick = "ExitMenu_Click()"

$NotifyIcon = $System.NotifyIcon()
$NotifyIcon.Icon = $Form.Icon
$NotifyIcon.Text = $Form.Text
$NotifyIcon.Visible = "True"
$NotifyIcon.OnDoubleClick = "NotifyIcon_DoubleClick()"

$Form.Running = 1
While $Form.Running
    $ = Execute($Form.DoEvents)
Loop
Exit 1
/***********************************************/
; двойной щелчок по иконке в трее:
Function NotifyIcon_DoubleClick()
    If Not $Form.Visible Or $Form.WindowState = 1
        $Form.WindowState = 0
        $Form.Show()
        $Form.Activate()
    Endif
EndFunction

Function Form_Resize()
    If $Form.WindowState = 1
        $Form.Hide()
    Endif
EndFunction

Function ExitMenu_Click()
    $Form.Running = 0
EndFunction

Объект Kixtart.System поддерживает довольно много элементов управления для форм, вплоть до TreeView, позволяя создать довольно красивый GUI. Примеры:






Примеры построения GUI вы можете найти на этой странице. На этом же сайте вы можете найти онлайн-документацию (CHM есть и в поставке) и форум (англ.).

На том же сайте вы можете скачать новую версию KiXforms.NET, которая реализована на платформе .NET и поддерживает похожую функциональность. KiXforms.NET устанавливается из msi-инсталлятора и регистрирует COM-сервер Kixforms.System, который будет работать параллельно с сервером Kixtart.System, если KiXforms Classic уже был установлен ранее. В поставке KiXforms.NET имеется chm-файл справки, правда, без примеров кода (примеры можно найти на форуме).

Примечательно, что COM-серверы Kixtart.System и Kixforms.System можно использовать и в других языках программирования, которые в состоянии выступить в роли OLE-клиента.

COM-сервер "KiXtart.Application"

В поставке KiXtart есть библиотека KiXtart.dll, зарегистрировав которую, вы получите COM-сервер KiXtart.Application, который можно использовать в любых языках программирования, которые в состоянии выступить в роли OLE-клиента. Регистрация библиотеки производится командой наподобие следующей:

regsvr32 KiXtart.dll

Функциональность COM-сервера позволяет синхронно или асинхронно запустить указанный скрипт KiXtart, а также непосредственно получить значения макросов KiXtart (которые доступны как свойства объекта). В поставке KiXtart вы найдёте несколько примеров использования COM-сервера на VBScript и VBA.

Людоговский Александр, 02.02.2009г.

Перейти на главную страничку сайта (список статей, файлы для скачивания)

© 2007 http://www.script-coding.com При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.