Как передать параметры скрипту UltraEdit из командной строки?

Теперь скрипт UltraEdit выполняется из командной строки:

uedit64.exe /s="J:\SkyDrive\work\ue-script\newFile.js"

Можно ли передать параметры скрипту UltraEdit из командной строки? И как их получить в сценарии?

Может быть так:

uedit64.exe /s="J:\SkyDrive\work\ue-script\newFile.js" /pars="parameter1=value1,parameter2=value2"

А потом получить parameter1=value1 а также parameter2=value2 в newFile.js,

1 ответ

Сценарии UltraEdit обычно выполняются из командной строки для переформатирования 1 или более текстовых файлов полностью без участия пользователя и без зависимости от параметров. Или сценарий UltraEdit запускается вручную пользователем из UltraEdit без или с минимальным вмешательством пользователя, используя getString и / или getValue, Существует множество языков сценариев и интерпретаторов сценариев для выполнения каких-либо действий в зависимости от таких параметров, как VBScript, PowerShell, Perl, Python, ...

В командной строке UltraEdit невозможно указать дополнительные пользовательские параметры для макроса / скрипта UltraEdit. Аргументы командной строки интерпретируются uedit64.exe или же uedit32.exe а макросы и скрипты UltraEdit не имеют доступа к списку аргументов исполняемого файла.

Мне известны 3 возможности передачи строк (параметров) в сценарий UltraEdit из другого процесса перед запуском UltraEdit и выполнением сценария:

  1. через буфер обмена или
  2. через текстовый файл или
  3. изменив скрипт перед выполнением.

1. Передать параметры в скрипт UE/UES через буфер обмена

Первое решение легко реализовать. Но у него есть большие недостатки: содержимое буфера обмена Windows изменяется при запуске, и никакой другой процесс не должен копировать что-либо в буфер обмена до того, как параметры и их значения будут прочитаны сценарием. Эти недостатки очень проблематичны, если UltraEdit должен выполняться в фоновом режиме для выполнения скрипта.

Следующие две команды должны быть выполнены в командной строке или в командном файле:

echo parameter1=value1,parameter2=value2 | %SystemRoot%\System32\clip.exe
uedit64.exe /fni /s="J:\SkyDrive\work\ue-script\newFile.js"

clip.exe доступно с Windows Vista и Windows Server 2003. Но нет clip.exe на Windows XP. Тем не мение, clip.exe из Windows Server 2003 также можно использовать в Windows XP.

Настоятельно рекомендуется использовать /fni (принудительно создать новый экземпляр) при запуске UltraEdit для выполнения сценария из командной строки, когда параметр конфигурации Разрешить несколько экземпляров не установлен по умолчанию. Для объяснения, почему /fni должен использоваться в качестве первого параметра в командной строке при запуске макроса / скрипта UltraEdit из командной строки. Читать тему Всегда получать сообщение об ошибке при запуске макроса / скрипта с помощью параметра командной строки (решено) на форуме UltraEdit.

Пример кода скрипта для чтения параметров из буфера обмена:

// Copy content of system (Windows/Mac/Linux) clipboard to a variable.
UltraEdit.selectClipboard(0);
var sParameterList = UltraEdit.clipboardContent;

// For safety check if the first parameter string begins with "parameter1".
if (sParameterList.indexOf("parameter1") == 0)
{
    // Remove trailing withspaces from parameter list
    var sParameterList = sParameterList.replace(/\s+$/,"");

    // Split up the parameters list using comma as delimiter.
    var asParameterList = sParameterList.split(',');

    // For demonstration just open a message box listing the read
    // parameters with their values without splitting them up further.
    var sMessageText = "The parameter";
    if (asParameterList.length > 1)
    {
        sMessageText += "s are:\n";
    }
    else
    {
        sMessageText += " is:\n";
    }
    for (var nParameter = 0; nParameter < asParameterList.length; nParameter++)
    {
        sMessageText += '\n   "' +  asParameterList[nParameter] + '"';
    }
    UltraEdit.messageBox(sMessageText,"List of parameters");
}

2. Передать параметры в скрипт UE/UES через текстовый файл

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

>C:\Temp\ParameterList.tmp echo parameter1=value1,parameter2=value2
start "" /wait uedit64.exe /fni /s="J:\SkyDrive\work\ue-script\newFile.js"
del C:\Temp\ParameterList.tmp

Вывод строки по команде ECHO перенаправляется в текстовый файл C:\Temp\ParameterList.tmpзатем запускается UltraEdit для запуска сценария в отдельном процессе, и пакетная обработка останавливается до выхода из UltraEdit. Наконец временный текстовый файл удаляется из командной строки.

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

// Define the name of the file with the parameters with full path.
// The usage of environment variables in file name is not possible.
var sParameterListFile = "C:\\Temp\\ParameterList.tmp";

// Remember document index of active document which requires UltraEdit for
// Windows v16.00 or UEStudio v10.00. It would be possible to use code to
// get document index of active document on using an even older version of
// UltraEdit or UEStudio.
var nActiveDocIndex = UltraEdit.activeDocumentIdx;

// Open the parameter list file. This file should not be opened already
// before running this script. Otherwise additional code would be needed
// to search first in list of opened files for this file and read the
// parameters from already opened file and keep the file open instead
// of opening it and closing it after reading the first line.
UltraEdit.open(sParameterListFile);

// Test with a case-sensitive string comparison if the file could be really
// opened successfully in which case the parameter list file is the active
// file whose path property is the full name of the file with path.
if (UltraEdit.activeDocument.path == sParameterListFile)
{
    // Define environment for this script.
    UltraEdit.insertMode();
    UltraEdit.columnModeOff();

    // Read from the parameter list file just the first line without
    // the line terminating character(s) and split up the parameters
    // list using comma as delimiter before closing the file.
    UltraEdit.activeDocument.startSelect();
    UltraEdit.activeDocument.key("END");
    UltraEdit.activeDocument.endSelect();
    var asParameterList = UltraEdit.activeDocument.selection.split(',');
    UltraEdit.closeFile(UltraEdit.activeDocument.path,2);

    // For safety check if the first parameter string begins with "parameter1".
    if (asParameterList[0].indexOf("parameter1") == 0)
    {
        // For demonstration just open a message box listing the read
        // parameters with their values without splitting them up further.
        var sMessageText = "The parameter";
        if (asParameterList.length > 1)
        {
            sMessageText += "s are:\n";
        }
        else
        {
            sMessageText += " is:\n";
        }
        for (var nParameter = 0; nParameter < asParameterList.length; nParameter++)
        {
            sMessageText += '\n"' +  asParameterList[nParameter] + '"';
        }
        UltraEdit.messageBox(sMessageText,"List of parameters");
    }

    // Make the previously active document again the active
    // document if there was any document opened before at all.
    if (nActiveDocIndex >= 0)
    {
        UltraEdit.document[nActiveDocIndex].setActive();
    }
}

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

>"%TEMP%\Any File Name.txt" echo parameter1=value1,parameter2=value2
start "" /wait uedit64.exe /fni "%TEMP%\Any File Name.txt" /s="J:\SkyDrive\work\ue-script\newFile.js"
del "%TEMP%\Any File Name.txt"

Код сценария для этого решения может быть что-то вроде:

if (UltraEdit.document.length > 0)  // Is any file opened?
{
    // Define environment for this script.
    UltraEdit.insertMode();
    UltraEdit.columnModeOff();

    // Move caret to top of first opened file which should
    // be the file with the parameters for the script.
    UltraEdit.document[0].top();

    // Read from the parameter list file just the first line without the
    // line terminating character(s) and split up the parameters list
    // using comma as delimiter. The parameter list file remains opened.
    UltraEdit.document[0].startSelect();
    UltraEdit.document[0].key("END");
    UltraEdit.document[0].endSelect();
    var asParameterList = UltraEdit.document[0].selection.split(',');

    // For safety check if the first parameter string begins with "parameter1".
    if (asParameterList[0].indexOf("parameter1") == 0)
    {
        // For demonstration just open a message box listing the read
        // parameters with their values without splitting them up further.
        var sMessageText = "The parameter";
        if (asParameterList.length > 1)
        {
            sMessageText += "s are:\n";
        }
        else
        {
            sMessageText += " is:\n";
        }
        for (var nParameter = 0; nParameter < asParameterList.length; nParameter++)
        {
            sMessageText += '\n"' +  asParameterList[nParameter] + '"';
        }
        UltraEdit.messageBox(sMessageText,"List of parameters");
    }
}

3. Модификация скрипта перед выполнением

Файл сценария UltraEdit представляет собой текстовый файл ANSI, поэтому сценарий можно изменить перед выполнением.

echo var asParameterList = [ "value1", "value2" ];>"%TEMP%\ParameterList.tmp"
copy /B "%TEMP%\ParameterList.tmp" + "J:\SkyDrive\work\ue-script\newFile.js" "%TEMP%\TempScript.js" >nul
start "" /wait uedit64.exe /fni /s="%TEMP%\TempScript.js"
del "%TEMP%\ParameterList.tmp" "%TEMP%\TempScript.js"

Строка кода JavaScript, которая определяет инициализированный массив строк, сначала записывается во временный файл. Этот временный файл копируется вместе с файлом сценария в новый сценарий в папке для временных файлов. UltraEdit выполняется с использованием временного файла сценария с добавленным массивом списка параметров. Наконец, оба временных файла удаляются из командной строки.

Пример кода сценария, который динамически расширяется с помощью дополнительной строки вверху для определения строк параметров:

// For demonstration just open a message box listing the parameter
// values as defined at top of the script from outside UltraEdit.
var sMessageText = "The parameter value";
if (asParameterList.length > 1)
{
    sMessageText += "s are:\n";
}
else
{
    sMessageText += " is:\n";
}
for (var nParameter = 0; nParameter < asParameterList.length; nParameter++)
{
    sMessageText += '\n"' +  asParameterList[nParameter] + '"';
}
UltraEdit.messageBox(sMessageText,"List of parameter values");

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

Последний вариант будет использовать // include parameters.js в верхней части файла сценария и файла parameters.js (с полным путем или без пути) создается динамически в командной строке, содержащей строки для определения параметров на языке JavaScript как переменных JavaScript.

Другие вопросы по тегам