如何从命令行将参数传递给 UltraEdit 脚本?



现在,UltraEdit脚本从命令行执行:

uedit64.exe /s="J:SkyDriveworkue-scriptnewFile.js"

是否可以从命令行将参数传递给 UltraEdit 脚本?我如何在脚本中获取它们?

也许是这样的:

uedit64.exe /s="J:SkyDriveworkue-scriptnewFile.js" /pars="parameter1=value1,parameter2=value2"

然后在newFile.jsparameter1=value1parameter2=value2.

UltraEdit 脚本通常从命令行执行,以完全重新格式化一个或多个文本文件,无需用户交互,也不依赖于参数。或者,UltraEdit 脚本由用户从 UltraEdit 中手动启动,而无需或使用getString和/或getValue进行一些最少的用户交互。有许多脚本语言和脚本解释器可以根据VBScript,PowerShell,Perl,Python等参数执行某些操作。

无法在 UltraEdit 的命令行上为 UltraEdit 宏/脚本指定其他自定义参数。命令行参数由uedit64.exeuedit32.exe解释,UltraEdit 宏和脚本无权访问可执行文件的参数列表。

我知道在启动UltraEdit并执行脚本之前,有三种可能性可以从另一个进程将字符串(参数)传递给UltraEdit脚本:

  1. 通过剪贴板,或
  2. 通过文本文件,或
  3. 通过在执行前修改脚本。

1.通过剪贴板将参数传递给UltraEdit/UEStudio脚本

第一个解决方案易于实施。但它有一个很大的缺点,即 Windows 剪贴板内容在启动时被修改,并且在脚本读取参数及其值之前,没有其他进程应将某些内容复制到剪贴板。如果 UltraEdit 应该在后台执行以执行脚本,则这些缺点是非常成问题的。

必须在命令行或批处理文件中执行以下两个命令:

echo parameter1=value1,parameter2=value2 | %SystemRoot%System32clip.exe
uedit64.exe /fni /s="J:SkyDriveworkue-scriptnewFile.js"
clip.exe

自WindowsVista和Windows Server 2003以来一直可用。但是在Windows XP上没有clip.exe。但是,Windows Server 2003 中的clip.exe也可以在 Windows XP 上使用。

强烈建议在启动 UltraEdit 时使用/fni(强制新实例)从命令行执行脚本,前提是默认情况下未选中允许多个实例。有关从命令行运行 UltraEdit 宏/脚本时应将/fni用作命令行上的第一个参数的说明,请阅读 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. 通过文本文件将参数传递给UltraEdit/UEStudio脚本

与第一个解决方案相比,不会使用此解决方案修改剪贴板。但是,必须确保两个进程不会同时执行以下命令行。

> C:TempParameterList.tmp echo parameter1=value1,parameter2=value2
start "" /wait uedit64.exe /fni /s="J:SkyDriveworkue-scriptnewFile.js"
del C:TempParameterList.tmp

命令ECHO输出的行被重定向到文本文件C:TempParameterList.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:SkyDriveworkue-scriptnewFile.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:SkyDriveworkue-scriptnewFile.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 变量的行。

最新更新