﻿kIT Portable Launcher
=========================
Утилита позволяет организовать простейшую форму портабельности для непортабельных программ.
Утилита запускает программу (да и любые исполняемые файлы), выполняя до запуска и/или по завершении определённые действия:
• импорт reg-файла перед запуском;
• удаление имеющихся в реестре ключей перед импортом;
• сохранение имеющихся ключей в reg-файл перед удалением;
• запоминание имевшихся ключей и их восстановление по завершении работы запускаемой программы;
• сохранение ключей реестра по завершении работы запускаемой программы, но перед восстановлением.
Кроме того:
• полная поддержка переменных окружения и относительных путей;
• поддержка UNICODE при импорте/экспорте reg-файлов;
• мгновенный запуск, крошечный размер, минимум потребления ресурсов.
Программа не производит никакого контроля доступа, поэтому она сможет внести конкретный ключ в реестр только, если на это достаточно прав у текущего пользователя.
Например, в куст HKEY_CURRENT_USER может вносить изменения даже обычный пользователь.
=========================
kitrun.exe [/f] [/p|/P] [/w|/W] [/d|/D] [/u|/U] [/r|/R]
           [/b|/B (:|<файл>)] [/s|/S (:|<файл>)] [/k <ключ_реестра>]
           <reg-файл> <строка_запуска>
=========================
Обязательные параметры:
<reg-файл> — имя существующего reg-файла (расширение не имеет значения), который нужно импортировать в реестр.
<строка_запуска> — командная строка запуска программы, возможно, со своими параметрами, поэтому должна быть последним элементом строки.
=========================
Необязательные параметры:
/f — (force) форсировать импорт reg-файла. Параметр /k лишается смысла.
==========
/p — (path, portability) разрешать относительные пути, начиная от папки самого kitrun.exe.
 /P — разрешать относительные пути, начиная от папки запускаемой программы (если путь к ней задан абсолютно, в противном случае /P игнорируется).
 по умолчанию — относительно рабочей папки kitrun.exe.
==========
/w — (workdir) установить для запускаемой программы рабочую папку, равную папке самого kitrun.exe.
 /W — установить для запускаемой программы рабочую папку, равную папке запускаемой программы (если путь к ней задан абсолютно, в противном случае /W игнорируется).
 по умолчанию — рабочая папка kitrun.exe.
==========
/d — (delete) удалить из реестра имеющиеся ключи, которые будут внесены.
 /D — аналогично /d, но удалятся целиком самые высокоуровневые ключей, которые будут внесены.
==========
/u — (unregister) дождаться завершения запущенной программы и удалить из реестра внесенные ключи, не удаляя имевшиеся ранее подключи.
 /U — аналогично /u, но удалить целиком самые высокоуровневые из внесённых ключей.
==========
/r — (restore) запомнить исходное состояние ключей, которые будут внесены, и импортировать их обратно в реестр после завершения запускаемой программы.
 /R — аналогично /r, но запоминаются целиком самые высокоуровневые из вносимых ключей.
==========
/b <файл> — (backup) перед импортом reg-файла сохранить текущее содержимое вносимых ключей в указанный файл (расширение не имеет значения) в синтаксисе reg-файлов. Если вместо имени файла указано двоеточие, то берётся имя основного reg-файла.
 /B — аналогично /b, но сохраняются целиком самые высокоуровневые из внесённых ключей.
==========
/s <файл> — (save) по завершении запускаемой программы сохранить текущее содержимое вносимых ключей в указанный файл (расширение не имеет значения) в синтаксисе reg-файлов. Если вместо имени файла указано двоеточие, то берётся имя основного reg-файла.
 /S — аналогично /s, но сохраняются целиком самые высокоуровневые из внесённых ключей.
==========
/k <ключ_реестра> — (key) проверить наличие этого ключа для принятия решения об импорте. Наличие первого ключа из reg-файла ни на что не влияет.
==========
Параметры можно объединять в любых комбинациях. Однако параметр, имеющий подпараматры, должен быть последним в наборе букв.
=========================
Примеры использования:
==========
kitrun path\config.reg path\prog.exe param1 param2
— если первый ключ из config.reg уже присутствует, config.reg не будет импортирован, а сразу запустится программа с заданными параметрами.
==========
kitrun /f /U path\config.reg path\prog.exe
— config.reg импортируется в любом случае, а после завершения выполнения программы, из реестра удаляются самые высокоуровневые ключи, упомянутые в config.reg, вместе со всеми подключами (даже не импортированными из config.reg).
==========
kitrun /f /u path\config.reg path\prog.exe
— аналогично предыдущему варианту, но удалятся только ключи, импортированные из config.reg.
==========
kitrun /u path\config.reg path\prog.exe
— на девственной системе config.reg импортируется, и по завершении программы ключи удалятся. Но если запускаемая программа создаст новые ключи в данной ветке, то последующие запуски с такими параметрами не приведут к импорту config.reg, так как высокоуровневые ключи останутся в реестре.
==========
kitrun /fp /DUR /S : putty.reg path\putty.exe
— если предположить, что рядом с kitrun.exe лежит putty.reg, то данная строка запуска обеспечивает некую ПЕСОЧНИЦУ, притом чистую. PuTTY будет запущен с настройками, взятыми из putty.reg, а после его завершения соответствующая ветка будет возвращена в исходное состояние. Большая буква S обеспечивает сохранение даже новых ключей, созданных в процессе работы программы.
=========================
Алгоритм работы:
 1) Если задан /f, то перейти к (2), иначе,
  1.1) если задан параметр /k, проверить наличие указанного ключа в реестре, иначе
   1.1.1) если /k опущен, прочитать первый ключ из указанного reg-файла и проверить его наличие в реестре.
 2) Если задан /r (или /R),
     поместить в память текущее содержимое вносимых ключей (или целиком самые высокоуровневые из вносимых ключей, если /R).
 3) Если задан /b (или /B),
     сохранить в заданный файл текущее содержимое вносимых ключей (или целиком самые высокоуровневые из вносимых ключей, если /B).
 4) Если задан /d (или /D),
     удалить ключей, которые будут внесены (или целиком самые высокоуровневые из этих ключей, если /D).
 5) Если ключ, выбранный в пункте (1), отсутствует,
     импортировать указанный reg-файл в реестр.
 6) Исполнить заданную командную строку.
 7) Если не задан ни один ключ из /b, /B, /s, /S, /u, /U, /r /R,
     то перейти к (11),
     иначе дождаться завершения запущенной программы.
 8) Если задан /s или /S,
     сохранить в заданный файл текущее содержимое вносимых ключей (или целиком самые высокоуровневые из вносимых ключей, если /S).
 9) Если задан /u (или /U),
     удалить из реестра внесённые ключи (или целиком самые высокоуровневые из вносимых ключей, если /U).
10) Если задан /r (или /R),
     импортировать запомненные ключи с их содержимым обратно в реестр.
11) Завершиться.
=========================
Пояснения и особые ситуации:
— Параметр /r (или /R) сам по себе НЕ заставляет программу удалять имеющиеся ключи, а только импортировать сохранённые. Поэтому, если требуется максимально точно восстановить состояние реестра, которое было до запуска программы, нужно дополнительно указать ключ /U, который удалит все затронутые ветки ПЕРЕД восстановлением сохранённых ключей.
— Если в качестве основного reg-файла и файла параметра /b (или /B) указан один и тот же файл, то сохранение в него текущих значений произойдёт ПОСЛЕ его прочтения для импорта. То есть старые и новые значения поменяются местами. При следующем запуске с теми же параметрами и в реестр и в файл попадут изначальные значения. Это можно использовать в качестве некоего переключателя.
— Параметр /s (или /S), очевидно, тоже срабатывает после чтения reg-файла для импорта, и если здесь указан тот же reg-файл, что и в качестве основного, то можно от запуска к запуску изменять и дополнять reg-файл, связанный с программой. А в сочетании с ключом /r можно создать некое подобие портативного профиля (песочницы), не зависящего от настроек текущего пользователя и не влияющего на них.
— Важно понимать, что основное поведение программы остаётся неизменным. Если ключ реестра (первый в reg-файле или заданный через /k) ИМЕЕТСЯ в реестре (и не задана /f), то все параметры вроде /b, /u будут проигнорированы.
— Параметры /b (или /B) и /r (или /R) взаимонезависимы, хотя и оперируют абсолютно одинаковыми данными. Допустимо задать их обоих одновременно.
=========================
Ограничения:
— Двоичные данные в значениях экспортируются без переносов строк (с символом "\" в конце каждой строки). Это не нарушает стандарт, reg-файл остаётся корректным.
=========================
История:
1.0 (2011-08-18)
Реализован основной функционал.
Реализован ключ /f.
Реализован ключ /k.
1.2 (2011-08-22)
Реализован ключ /u.
Добавлен ключ /e (в последствии переименован в /U).
Для запускаемой программы устанавливается рабочая папка, равная рабочей папке kitrun.exe
Исправлена ошибка с обработкой параметров.
Запрещён feedback-эффект курсора для самого kitrun.exe.
1.3 (2011-08-26)
Ключ /e переименован в /U в целях унификации с ключами /b и /s.
Сообщение "Wrong usage!" дополнено открытием в фоне readme.txt.
1.4 (2011-08-27)
Исправлена ошибка, из-за которой /u выполнялся даже, если ключи не были импортированы (т.к. уже были в реестре и /f не задан).
Добавлены ключи /p и /P.
Во всех строках, потенциально содержащих пути, заменяются переменные окружения. Т.е. во всех, кроме аргумента параметра /k, в том числе в параметрах запускаемой программы.
1.6 (2011-08-28)
Реализованы параметры /b, /B.
Реализованы параметры /s, /S.
1.7 (2011-08-29)
Реализованы параметры /r, /R.
Реализованы параметры /d, /D.
1.8 (2011-08-30)
Реализована поддержка UNICODE везде: хранение в памяти, экспорт, импорт.
Снято ограничение на размер имени ключа. Теперь максимальный размер, как и прописано в стандарте, 16383 UNICODE-символа.
1.9 (2011-09-11)
Убрано появление окна "Wrong usage!" в случае отсутствия reg-файла или exe-файла. Появляется только при ошибке в параметрах.
Реализована возможность объединять несколько параметров за одним слешем.
Параметры /b, /B, /s, /S дополнены возможностью указать ":" вместо имени файла. При этом берётся имя основного reg-файла.
Исправлена передача аргументов программе: не восстанавливались кавычки в аргументах с пробелами.
1.9.1 (2011-09-13)
Исправлено: не запускались программы, требующие повышения полномочий (UAC).
Добавлены параметры /w, /W
Добавлена проверка корректности reg-файла.
Добавлена информация о версии файла.
1.9.2 (2011-09-15)
Исправлено: экспортировалось отсутствующее значение по умолчанию (@="").
Исправлено: пара потенциальных утечек памяти.
1.9.3 (2011-09-30)
Исправлено: параметры /p и /P перестали работать (после "Реализована возможность объединять несколько параметров за одним слешем." в 1.9.0).
Исправлено: если программа отсутвовала, а reg-файл присутствовал, то параметры, связанные с ожиданием завершения, отрабатывались лишь на половину.
Исправлено: ошибочно отбраковывались reg-файлы в кодировке ANSI (после "Добавлена проверка корректности reg-файла." в 1.9.1).
=========================
Контакты:
ApceH Hypocrite: apcehypo@gmail.com
=========================
