Как передать параметры скрипту 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. Передать параметры в скрипт 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.