自动将目标文件夹中的所有脚本包含在已运行的脚本中 - CS6
Posted
技术标签:
【中文标题】自动将目标文件夹中的所有脚本包含在已运行的脚本中 - CS6【英文标题】:Automaticly include all scripts from target folder in runned script - CS6 【发布时间】:2020-05-17 22:04:16 【问题描述】:我想#include
目标文件夹中的所有脚本动态 在运行的脚本中。无需每次写出每个脚本名称/路径。 这意味着: => 将任何脚本放入目标文件夹 => 运行脚本时,来自目标的脚本/脚本会自动包含到运行的脚本中。
编辑:您还可以从任何范围内的注入代码中调用任何函数或变量。 到目前为止,我写了这个脚本:
var runnedScriptPath = $.fileName;
var runnedScriptFolderPath = getScriptFolder(runnedScriptPath);
var targetScriptsFolderPath = runnedScriptFolderPath + "/foo";
var targetScriptsFolder = Folder(targetScriptsFolderPath);
includeScriptsFromTargetFolder(targetScriptsFolder);
function includeScriptsFromTargetFolder(targetFolder)
var targetFolderFiles = targetFolder.getFiles();
var scriptFilesToInclude = new Array;
for (var i = 0; i < targetFolderFiles.length; i++)
if (targetFolderFiles[i] instanceof File)
if (targetFolderFiles[i].toString().match(/.jsx$/)) // .jsx is extension from Adobe's scripts
scriptFilesToInclude.push(decodeURIComponent(targetFolderFiles[i]) ); // decodeURIComponent method is used becouse path is URl
for (var i = 0; i < scriptFilesToInclude.length; i++)
#include scriptFilesToInclude[i]; // <===== this line gives error!
function getScriptFolder(scriptPath)
return scriptPath.match(/^(.*[\\\/])/g); // match(/^(.*[\\\/])/g) "Select everything before the last forward slash" //
但后来我得到了这个错误:
我在第 235 页的“预处理器指令”一章的 javascript tools guide cs6.pdf 中找不到任何合理的解决方案。
我的推理是:scriptFilesToInclude[i]
结果是字符串,所以它应该被视为"some path/runned code folder/foo/bar.jsx"
。然后将字符串路径加载到脚本中。但不是它,我想它试图在已运行脚本的文件夹中找到一个名为:scriptFilesToInclude[i]
的文件。
================================================ ===============
注意事项:
我尝试使用eval:eval("#include scriptFiles[i]");
还有JSON.pars():JSON.parse("#include scriptFiles[i]");
绕过错误,但它也不起作用。
提前感谢您的帮助。
【问题讨论】:
我看到我被否决了,谁能说这个问题有什么问题? 这个问题的格式很好。我不知道你为什么会被否决。我只想指出#include
不是 JavaScript 关键字。是您正在使用的引擎中的特定关键字。我猜它会进行静态分析并且不动态包含脚本。它只是获取#include
之后的字符串并加载它。作为一个特殊的怪异引擎,如果可能的话,我想这不是一件容易的事。
“作为一个特殊的怪异引擎,我想这不是一件容易的事,包括动态”。顺便提一句。如果有人给出了不可能做到的答案并且他证明了这一点,那么通过***的标准问题是否解决了?
是的,当然,不要误会我的意思。我的意思是,我在这里看到了很多没有答案的问题,而这个似乎很难找到人,仅此而已哈哈。对了,下面好像有人知道他在说什么。
【参考方案1】:
使用$.evalFile()
代替eval()
:
$.evalFile(scriptFiles[i]);
【讨论】:
好吧,乍一看它是有效的,但我问的不是这个。也许问题不够精确(出于这个原因,我进行了编辑)。我根据第 219 页上的文档进行了测试。 $.evalFile() 执行 脚本并返回评估结果。不是脚本本身。以后不能使用该脚本中的函数和变量。 是的,你可以。这将执行脚本并且其所有功能都将可用。 prnt.sc/qweqpq 将#include
与动态变量一起使用是行不通的。
好的,我测试过,它在你写的例子中工作,但它在我的例子中没有(它仍然找不到 var 或函数)。 images,files。听起来存在某种范围问题。
好的,当我从函数中取出它时,它已经开始工作了。所以这是范围问题。感谢您的帮助。
不要忘记接受,以便其他人更快找到答案。【参考方案2】:
正如@Sergey Kritskiy 之前提到的,它必须使用$.evalFile()
函数。 但它需要在全局范围内调用,才能从包含的文件中上传变量或函数到任何你需要的地方。
代码:
var runnedScriptPath = $.fileName;
var runnedScriptFolderPath = getScriptFolder(runnedScriptPath);
var targetScriptsFolderPath = runnedScriptFolderPath + "/foo";
var targetScriptsFolder = Folder(targetScriptsFolderPath);
var scriptsToInclude = includeScriptsFromTargetFolder(targetScriptsFolder);
for (var i = 0; i < scriptsToInclude.length; i++)
$.evalFile(scriptsToInclude[i]); // <========= this function has to be invoked in global scope
function includeScriptsFromTargetFolder(targetFolder)
var targetFolderFiles = targetFolder.getFiles();
var scriptFilesToInclude = new Array;
for (var i = 0; i < targetFolderFiles.length; i++)
if (targetFolderFiles[i] instanceof File)
if (targetFolderFiles[i].toString().match(/.jsx$/)) // .jsx is extension from Adobe's scripts
scriptFilesToInclude.push(decodeURIComponent(targetFolderFiles[i]) ); // decodeURIComponent method is used becouse path is URl
return scriptFilesToInclude;
function getScriptFolder(scriptPath)
return scriptPath.match(/^(.*[\\\/])/g); // match(/^(.*[\\\/])/g) "Select everything before the last forward slash" //
【讨论】:
它需要在你想使用函数/变量的同一个范围内被调用:同样的规则在 js 中无处不在。以上是关于自动将目标文件夹中的所有脚本包含在已运行的脚本中 - CS6的主要内容,如果未能解决你的问题,请参考以下文章
selenium 如何在已打开的浏览器上继续运行自动化脚本?