自动将目标文件夹中的所有脚本包含在已运行的脚本中 - 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 如何在已打开的浏览器上继续运行自动化脚本?

shell脚本中的$<是啥意思?谢谢!

.NET - 此脚本的每个单独部分都可以工作,但是作为一个整体运行它会导致它替换我的SVG文件中的所有文本

自动化批处理文件和PowerShell脚本执行

第一单元笔记2

如何将GITHUB中的文件传递给python脚本并使用jenkins自动化?