Передача параметров скрипту

  • Автор темы Автор темы folique
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

folique

Участник
Топикстартер
Сообщения
81
Реакции
0
js-cкрипт запускается из другого скрипта посредством File.execute().
Могу ли я из вызывающего скрипта передать в вызываемый какие-либо параметры?
Спасибо.
 
Ответ: Передача параметров скрипту

Нет ничего проще. Создайте файл с этими параметрами.

AirGraph.
 
Ответ: Передача параметров скрипту

Спасибо, эта идея мне на ум тоже пришла первой.
Но это явно искусственный метод. Да и при большом количестве скриптов придется либо хранить большое количество фалов, либо держать все в одном файле с расстановкой меток, позиционированием в нем и пр., что также видится не очень удобным.
Да, еще вопрос сопутствующий, если позволите.
Если в процессе работы скрипта необходимо с клавиатуры ввести данные - какой инструмент для этого существует (диалог или что-то подобное).
Спасибо.
 
Ответ: Передача параметров скрипту

явно искусственный метод

Вероятно, "чистый" метод подключать библиотеки функций:

Код:
#include "File.jsx"


при большом количестве скриптов придется либо хранить большое количество фалов, либо держать все в одном файле с расстановкой меток, позиционированием в нем и пр., что также видится не очень удобным

Проще и удобней хранить свои данные в объектах:

Код:
object = {
    string: "hello",
    number: 123.456,
    boolean: true,
    array: ['a', 1, true, ['subarray', 2, false, ['subsubarray']]],
    object: {key: 'value', obj: {k: 'v'}},
    func: function() {alert('This function')},
    'любой текст': 'кириллица'
};


// свернем наш объект в строку
str = object.toSource();


// покажем ее
alert('Serialized object\n' + str);


// запишем строку в файл
f = new File(Folder.temp.absoluteURI + '/test' + (new Date()).getTime());
f.encoding = 'utf8';


if (!f.open('w') || !f.write(str)) {
    throw 'Не удалось записать файл';
}
f.close();


// удалим ссылки на объект и строку
// теперь данные хранятся только в файле
object = undefined, str = undefined;


// восстановим объект из файла
f.open('r');
restoredObject = eval(f.read());
f.close();


// выведем на консоль прочитанные элементы
for (var i in restoredObject) {
    $.write(i + ':\t' + restoredObject[i] + '\n');
}
// вызов функции
restoredObject.func();


Если в процессе работы скрипта необходимо с клавиатуры ввести данные - какой инструмент для этого существует (диалог или что-то подобное)

Самое простое - функция prompt:

Код:
s = prompt('Введите что-нибудь', 'здесь');

alert(s)
 
Ответ: Передача параметров скрипту

pirate-party, огромное спасибо!
Метод с записью объектов в файл выглядит уже гораздо изящней.
Про библиотеки функций не совсем понятно.
Директива #include просто подставляет содержимое файла в место вызова самой директивы, ведь так?
Как это поможет с передачей параметров?
 
Ответ: Передача параметров скрипту

Как это поможет с передачей параметров?

Обычно во внешние файлы выносят код повторяющийся в нескольких скриптах. Тогда при внесенни изменений вам будет достаточно поправить только одно место. Кроме того так удобнее тестировать большую программу.

Например содержимое файла "Lib.jsx":

Код:
Lib = {
    sum:  function(a, b) {return a + b},
    diff: function(a, b) {return a - b}
}


Тогда в вызвающем скрипте пишем:

Код:
#include "Lib.jsx"

n = parseFloat(prompt('Введите число №1', 0));
m = parseFloat(prompt('Введите число №2', 0));

alert('Сумма чисел: ' + Lib.sum(n, m) + 
    ',\nРазность: ' +   Lib.diff(n, m));

В этом случае в передаче параметров скрипту нет необходимости.
 
Ответ: Передача параметров скрипту

Согласен, но мы фактически тело вызываемого скрипта копируем в вызывающий.
Нас никак это не должно беспокоить ("распухает" код, скорость работы и пр.)?
Спасибо.
 
Ответ: Передача параметров скрипту

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

Код:
File.prototype.executeWithArguments = function(args) {    
    if (File.fs != 'Windows') throw 'Run this only on Windows!'
    
    // если передан массив, то преобразуем его в строку
    if (args instanceof Array) {
         args = args.join(' ');
    }
    
    // скрипт-обертка
    tempScript = '\
<job><script language="JScript">\
objShell = WScript.CreateObject("WScript.shell");\
objShell.Exec(\'wScript.exe "' + 
this.fsName.replace(/\\/g, '/') +
'" ' + args + '\');\
</script></job>\
';


    // запишем временный файл
    var tempFile = new File(Folder.temp.absoluteURI + '/tmp' 
        + (new Date()).getTime().toString(36) + '.wsf');
        
    if (!tempFile.open('w') || !tempFile.write(tempScript)) {
        throw 'Can not write temp file'
    }
    tempFile.close();
    
    // ...и выполним его
    tempFile.execute();


    // подождем завершения
    $.sleep(2222);


    // удалим временный файл
    tempFile.remove();
}

Пример использования:

Код:
f = File.openDialog('Выберите скрипт');

if (f) {
    args = prompt('Введите параметры разделяя их пробелами', 'arg1 arg2');
    
    if (args) {
        f.executeWithArguments(args);
    }
}
 
Ответ: Передача параметров скрипту

Уфф, это уже тяжко "с листа" воспринять, буду разбираться.
Не подскажете ли еще простую вещь - как программно остановить скрипт?
Спасибо большое!
 
Ответ: Передача параметров скрипту

как программно остановить скрипт?

У InDesign есть специальный метод exit, а у AI вороде как у нет ничего подобного. Приходится весь скрипт держать внутри функции, и ставить return для завершения в произвольном месте =(
 
Ответ: Передача параметров скрипту

Понял. Спасибо.
 
Статус
Закрыто для дальнейших ответов.