Ausgabe
Ich möchte #include
alle Skripte aus dem Zielordner dynamisch in das ausgeführte Skript einfügen. Ohne jedes Mal jeden Skriptnamen /Pfad aufschreiben zu müssen. Das bedeutet: => Sie ziehen ein beliebiges Skript in den Zielordner => Wenn Sie ein Skript ausführen, werden Skripte/Skripte vom Ziel automatisch in das ausgeführte Skript eingeschlossen.
BEARBEITEN: Sie können auch beliebige Funktionen oder Variablen aus injiziertem Code in jedem Bereich aufrufen.
Ich habe bisher dieses Skript geschrieben:
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" //
}
Aber dann bekam ich diesen Fehler: Ich konnte keine vernünftige Lösung in Javascript Tools Guide cs6.pdf im Kapitel “Präprozessor-Direktiven”, Seite 235
finden.
Meine Begründung ist: Das Ergebnis ist eine Zeichenfolge, also sollte es als behandelt werden . Und dann wird der String-Pfad in das Skript geladen. Aber stattdessen hat es wohl versucht, eine Datei im Ordner des ausgeführten Skripts mit dem Namen zu finden: .
scriptFilesToInclude[i]
"some path/runned code folder/foo/bar.jsx"
scriptFilesToInclude[i]
=============================================== ============
Hinweise:
Ich habe versucht, eval :
eval("#include scriptFiles[i]");
Und auch JSON.pars() :
JSON.parse("#include scriptFiles[i]");
Um Fehler zu umgehen, aber es hat auch nicht funktioniert.
Vielen Dank im Voraus für jede Hilfe.
Lösung
Wie @Sergey Kritskiy bereits erwähnt hat, muss die $.evalFile()
Funktion verwendet werden.
Es muss jedoch im globalen Bereich aufgerufen werden, um Variablen oder Funktionen aus der enthaltenen Datei überall dort hochladen zu können, wo Sie sie benötigen.
Code:
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" //
}
Beantwortet von – Lukkar
Antwort geprüft von – Senaida (FixError Volunteer)