Andrey_A_A Спасибо, увидел как параметры передаются, но это всё не то. Произвольную строку в скрипт, как я понял, не передать. Передача параметров через аргументы в TC по сравнению с AkelPad'ом реализована отстойно (может, конечно, я и ошибаюсь).
Avada Спасибо за доку.
По поводу скрипта. "На вкус и цвет...", как говорится. Далеко не великий скриптописец (скорее даже наоборот); сделал примитивно (с т.з. ООП) , да и "тяжелее" получился скрипт, но мне так больше нравится.
[more=em_configChangeIniFiles.js (mod)]
Код: // em_configChangeIniFiles.js
// Открытие файлов настройки Total Commander в указанном в параметрах запуска скрипта редакторе либо заданным в диалоге ТС "Настройка: Правка по F4"
//
// Модификация скрипта:
// Version: 2.0 (2014.11.17)
// Автор: VladSh <vladsh на fromru тчк com>
//
http://forum.ru-board.com/topic.cgi?forum=5&topic=45288&start=3680#17 //
// Оригинальный скрипт:
// Version: 1.1
// Автор: mozers™ <mozers@mail.ru>
// http://forum.wincmd.ru/viewpost.php?p=61155&sid=d8cd4c2148e75a549bd0b776d864758a
// ============================================================
//
// Параметры запуска задаются в usercmd.ini в секции с именем настроящего скрипта:
// • editors - возможные пути к файлам текстовых редакторов через ; или ,
// • files - перечень открываемых файлов, указанных через ; или ,
// Поддерживаемый в настоящее время перечень см. в значениях констант ниже.
// Константы для определения путей и открытия файлов
var file_wincmd_ini = 'wincmd.ini';
var file_usercmd_ini = 'usercmd.ini';
var file_wcx_ftp_ini = 'wcx_ftp.ini';
var file_ftp_ini = 'ftp.ini';
var file_wincmd_mnu = 'wincmd.mnu';
// Инициализируем нужные нам ActiveX объекты
try {
var WshShell = new ActiveXObject('WScript.Shell');
var fso = new ActiveXObject('Scripting.FileSystemObject');
} catch(e) {
WScript.Echo('Для работы скрипта необходима установка Windows Script Host (WSH)!');
WScript.Quit();
}
try {
var TCS = new ActiveXObject('TCScript.Helper');
} catch(e) {}
// Определение путей к конфигурационным файлам
var ConfigManager = {
lstConfigs: {},
profileDir: '', // местоположение файлов настройки
initialize: function() {
// wincmd.ini + определение пути к профилю
this.lstConfigs[file_wincmd_ini] = {
path: '',
getPath: function() {
if (!this.path) {
var envvar_commander_ini = '%COMMANDER_INI%';
this.path = WshShell.ExpandEnvironmentStrings(envvar_commander_ini);
if (this.path == envvar_commander_ini) {
WScript.Echo('Скрипт расчитан на работу с Total Commander верcии 6.55 или выше!');
WScript.Quit();
}
ConfigManager.profileDir = this.path.replace(/[^\\]*$/, '');
}
return this.path;
}
};
// usercmd.ini
this.lstConfigs[file_usercmd_ini] = {
path: '',
getPath: function() {
if (!this.path) {
this.path = ConfigManager.profileDir + file_usercmd_ini;
}
return this.path;
}
};
// wcx_ftp.ini
this.lstConfigs[file_wcx_ftp_ini] = {
path: '',
getPath: function() {
if (!this.path) {
this.path = ConfigManager.profileDir + file_wcx_ftp_ini;
}
return this.path;
}
};
// Имя пользовательского файла FTP настроек ftp.ini
this.lstConfigs[file_ftp_ini] = {
path: '',
getPath: function() {
if (!this.path) {
this.path = ConfigManager.profileDir + file_ftp_ini;
// если не будет найден, то откроется wcx_ftp.ini
if (!fso.FileExists(this.path))
this.path = ConfigManager.getPath(file_wcx_ftp_ini);
}
return this.path;
}
};
// Файл меню
this.lstConfigs[file_wincmd_mnu] = {
path: '',
getPath: function() {
if (!this.path) {
this.path = readINI(ConfigManager.getPath(file_wincmd_ini), 'MainMenu', '');
if (!/\\/.test(this.path)) {
this.path = WshShell.ExpandEnvironmentStrings('%COMMANDER_PATH%\\LANGUAGE\\' + this.path);
}
}
return this.path;
}
};
/* > Алгоритмы поиска каких-либо других файлов дописываем сюда < */
// Обязательное получение файлов, т.к. из них будут браться настройки
this.getPath(file_wincmd_ini);
},
getPath: function(filename) {
return this.lstConfigs[filename].getPath();
}
};
ConfigManager.initialize();
var usercmd_ini = ConfigManager.getPath(file_usercmd_ini);
// Поиск редактора, заданного в параметрах запуска скрипта
var editorPath;
var arrEditor = readIniEx(usercmd_ini, WScript.ScriptName, 'editors', '').split(/;|,/);
if (arrEditor[0]) {
var p = 0;
do {
editorPath = WshShell.ExpandEnvironmentStrings(arrEditor[p]);
if (fso.FileExists(editorPath)) break; else editorPath = '';
p += 1;
}
while (p < arrEditor.length)
}
// Если заданный вручную редактор отсутствует, то берем редактор, заданный в диалоге ТС "Настройка: Правка по F4"
if (!editorPath) {
editorPath = readINI(ConfigManager.getPath(file_wincmd_ini), 'Editor', '').replace('none', '');
if (editorPath) {
if (/%1/.test(editorPath)) { // это - для тех, кто после пути к редактору дописал %1
editorPath = editorPath.replace(/"*([^"]*)"*.*/, '$1');
}
}
// Если и в настройках TC редактор не найден, пробуем взять по пути редактора Windows
if (!editorPath || !fso.FileExists(editorPath)) {
var editorDefault = 'notepad.exe';
editorPath = WshShell.ExpandEnvironmentStrings('%WINDIR%\\' + editorDefault);
if (!fso.FileExists(editorPath)) {
WScript.Echo('Заданный редактор и ' + editorDefault + ' не найдены!');
WScript.Quit();
}
}
}
// Обрамляем полный путь к редактору кавычками
if (!/^\"/.test(editorPath))
editorPath = '"' + editorPath + '"';
// Определяем перечень файлов, которые нам нужно открывать
var arrFiles = readIniEx(usercmd_ini, WScript.ScriptName, 'files', file_wincmd_ini).split(/;|,/);
// Открываем файлы в порядке, указанном в параметрах запуска
for (var i = 0; i < arrFiles.length; i++) {
editFile(arrFiles[i]);
}
// = = = = = = = = Ф У Н К Ц И И = = = = = = = =
// Открытие файла в редакторе
function editFile(filename) {
var filepath = ConfigManager.getPath(filename);
if (filepath) {
if (fso.FileExists(filepath)) {
WshShell.Run(editorPath + ' "' + filepath + '"', 1, false);
}
}
}
// Чтение заданного ключа из секции "Configuration"
function readINI(filepath, key, default_value) {
return readIniEx(filepath, 'Configuration', key, default_value);
}
// Чтение заданного ключа из указанной секции
function readIniEx(filepath, section, key, default_value) {
var value;
// Если имеется установленный WSH Helper ActiveX for Total Commander (c)Volniy, то будем использовать его.
if (TCS) {
value = TCS.INIRead(filepath, section, key, default_value);
value = WshShell.ExpandEnvironmentStrings(value);
} else {
// Если нет, то обходимся встроенными средствами
value = default_value;
if (fso.FileExists(filepath)) {
if (fso.GetFile(filepath).Size > 0) {
var file = fso.OpenTextFile(filepath, 1, false);
var re = new RegExp('^' + key + '\s*=','i');
while (!file.AtEndOfStream){
var text = file.ReadLine();
if (re.test(text)){
value = WshShell.ExpandEnvironmentStrings(text.replace(/^.*=/,''));
break;
}
}
file.Close();
}
}
}
return value;
}