Est-il possible d'exécuter des scripts JSX depuis ExtendScript?

typiquement quand vous écrivez un .JSX script pour automatiser un produit Adobe (comme InDesign, Illustrator ou Photoshop), vous écrivez, déboguez et exécutez le script à partir de L'IDE ExtendScript. Est-il possible de contourner ExtendScript et d'exécuter le script à partir d'un troisième programme?

je pense que les produits Adobe ont un interpréteur JavaScript intégré auquel ExtendScript peut se connecter pour accéder aux modèles D'objets Adobe et automatiser leur logiciel. J'aimerais être capable de se connecter directement à l' interprétez et exécutez les fichiers jsx comme je le ferais avec ExtendScript.

28
demandé sur Thomas 2010-10-02 20:43:44

5 réponses

vous Êtes sur un Mac? Si c'est le cas, vous pouvez utiliser AppleScript avec le osascript outil pour exécuter votre JavaScript. Voici quelques exemples:

lancer JSX et retourner une valeur

l'Enregistrer comme ~/temp/foo.scpt:

tell application "Adobe Illustrator"
     -- 'do javascript' runs any arbitrary JS.
     -- We're using the #include feature to run another
     -- file. (That's an Adobe extension to JS.)
     --
     -- You have to pass a full, absolute path to #include.
     --
     -- The documentation alleges that 'do javascript'
     -- can be passed an AppleScript file object, but
     -- I wasn't able to get that to work.
     do javascript "#include ~/temp/foo.jsx"
end tell

Et l'enregistrer comme ~/temp/foo.jsx:

var doc = app.activeDocument;
var numLayers = doc.layers.length;

// The last value in the JSX file will be printed out by
// osascript. 
numLayers;

Maintenant, à partir de la ligne de commande, exécutez osascript ~/temp/foo.scpt il affichera le nombre de calques dans le document Active Illustrator.

extraire des données du JavaScript est limiter. Vous ne pouvez pas imprimer vers stdout à partir du JavaScript. Au lieu de cela, placez la valeur que vous voulez retourner comme la dernière instruction du fichier JSX; elle sera imprimée par osascript. (Voici pourquoi: la dernière valeur dans le fichier JSX est la valeur de retour de do javascript AppleScript statement. C'est aussi la dernière valeur du fichier AppleScript, et osascript imprime la valeur finale.)

la valeur que vous retournez à partir de JavaScript peut être un nombre, une chaîne de caractères, un tableau, ou tout autre élément qui retient sa valeur lorsqu'il est converti en chaîne. Si vous voulez retourner un objet complexe, vous devrez #inclure une bibliothèque JSON et appeler .toJSONString() sur l'objet.

passer des Arguments à JSX

pour passer des arguments au code JSX, suivez cet exemple:

le Fichier ~/temp/args.scpt:

on run argv
    tell application "Adobe Illustrator"
        set js to "#include '~/temp/args.jsx';" & return
        set js to js & "main(arguments);" & return
        do javascript js with arguments argv
    end tell
end run

le Fichier ~/temp/args.jsx

function main(argv) {
    var layer = app.activeDocument.activeLayer;
    app.defaultStroked = true; 
    app.defaultFilled = true;

    // Top, left, width, height (in points).
    // Note that parameters start at argv[0].
    layer.pathItems.rectangle(argv[0], argv[1], argv[2], argv[3]);
}

Et puis exécutez osascript args.scpt 50 30 10 80

Débogage

do javascript la commande a aussi des options pour le lancement du débogueur ExtendScript. Pour plus de détails, ouvrez le dictionnaire Illustrator dans AppleScript Editor.

35
répondu Evan 2012-01-27 16:23:42

pour les utilisateurs Windows, vous pouvez utiliser un script vbs. Passez les arguments à la.script jsx en fournissant des arguments à cscript commande comme ceci: cscript test.vbs "hello". test.vbs pourrait ressembler à cela:

Dim appRef
Dim javaScriptFile
Dim argsArr()

Dim fsObj : Set fsObj = CreateObject("Scripting.FileSystemObject")
Dim jsxFile : Set jsxFile = fsObj.OpenTextFile("C:\Users\path\test.jsx", 1, False)
Dim fileContents : fileContents = jsxFile.ReadAll
jsxFile.Close
Set jsxFile = Nothing
Set fsObj = Nothing

javascriptFile = fileContents & "main(arguments);"

Set appRef = CreateObject("Illustrator.Application")

ReDim argsArr(Wscript.Arguments.length-1)

For i = 0 To Wscript.Arguments.length-1
    argsArr(i) = Wscript.Arguments(i)
Next

Wscript.Echo appRef.DoJavaScript(javascriptFile, argsArr, 1)

Wscript.Echo renvoie la dernière ligne retournée par la .jsx fichier. Un. jsx fichier exemple pourrait être:

function main(argv) {
    alert(argv[0]);
    return "test";
}

Lorsqu'il est lancé, vous devriez voir L'alerte "hello" D'Illustrator (ou n'importe quel programme adobe) et ensuite "test" sera retourné à stdout (vous devriez le voir dans l'invite de commande fenêtre.)

11
répondu jfizz 2014-09-04 03:02:01

cela fonctionne sous windows:

attention au chemin vers Photoshop. Il doit être cité puisqu'il contient des espaces.

il y a beaucoup de trucs pour trouver où Photoshop est chargé. Voici un qui trouve chaque endroit où Photoshop a été chargé et Place ceux dans X. lst

@REM  The Presets\Scripts doesn't really restrict where the loop is looking, 
@REM  thus the "IF EXIST" is needed.  The FIND makes sure that the 
@for /R "%ProgramFiles(x86)%\Adobe" %%f in (Presets\Scripts) 
  DO @IF EXIST %%f 
     (echo %%f | FIND /I "Adobe Photoshop C" >> x.lst )

vous pouvez alors traiter chacun ligne en x.lst. NOTE: LE "@for" entier devrait être sur une ligne, je le divise en plusieurs lignes pour la lisibilité.

si vous croyez Qu'il n'y aura qu'un seul Photoshop (et pas D'éléments) alors vous pouvez changer "echo % % f"

"%%f\..\..\Photoshop.exe" C:\completepathto\my.jsx 
5
répondu Steven the Easily Amused 2014-03-26 01:54:55

La réponse est Oui. Illustrator, InDesign et Photoshop peuvent tous être scriptés via COM. Tout programme que vous créez qui peut accéder à COM (comme un langage .net, C++, BCX, Autohotkey ou Powerpro) peut dire à Illustrator, InDesign ou Photoshop de faire des choses.

Voici un exemple pour Powerpro (vous aurez besoin du plugin COM de powerpro), et cela fonctionne dans CS4 et CS5:

Function ComLoad() ;;MAKE SURE TO CALL .@ComUnload WHEN EXITING FUNCTION CALLS!
      static objname="Illustrator.Application"
      static com_status, com_type
      static appRef=com.create_object(objname)
      endfunction

Function ComUnload();;this is end the com calls and unload com
    com.unload
    endfunction

après avoir utilisé la fonction ComLoad (), vous exécutez tout type de méthode ou de fonction offerte par la bibliothèque COM. Voici comment utiliser Powerpro pour dire à Illustrator d'exécuter votre fichier jsx ou js:

;Run a script from anywhere
Function RunOtherScript(whatscript)
    If (file.Validpath(whatscript) == 0)do
        messagebox("ok","Whoops! That script doesn't exist!","ILL Runscript")
        quit
    endif
    .@ComLoad()
    appRef.DoJavaScriptFile(whatscript)
    .@ComUnload()
    quit

Voici une image d'une barre d'outils flottante que j'ai faite en utilisant Powerpro. Les boutons sont tous attachés aux fonctions com. La plupart du temps j'utilise les fonctions com pour exécuter externe jsx scripts.

enter image description here

[edit]

Il y a une autre façon! Vous pouvez utiliser Adobe Configurateur pour créer de nouveaux panneaux capables de lancer des scripts. Vous pouvez concevoir le panneau de n'importe quelle façon que vous voulez, et les résultats sont assez semblables dans l'effet à la barre d'outils powerpro que j'ai décrit ci-dessus. En fait, je suis passé de la barre d'outils powerpro à un panneau de configuration Adobe.

4
répondu bgmCoder 2014-02-24 01:44:56

si vous placez le .jsx les fichiers au bon endroit

Photoshop
folder location:
/Applications/Adobe\ Photoshop\ CS5/Presets/Scripts
menu location:
File > Scripts

Illustrator
folder location:
/Applications/Adobe\ Illustrator\ CS5/Presets.localized/en_GB/Scripts
menu location:
File > Scripts

InDesign
folder location:
/Users/{user}/Library/Preferences/Adobe\ InDesign/Version\ 7.0/en_GB/Scripts/Scripts\ Panel
menu location:
Window > Utilities > Scripts

Ce sont les chemins sur OSX, il devrait être facile de trouver L'équivalent sur Windows pour Photoshop et Illustrator, mais pour InDesign il pourrait être plus facile d'ouvrir le Panneau de Scripts et d'ouvrir le dossier scripts en utilisant le menu contextuel du Panneau.

je sais que vous pouvez exécuter .les scripts jsfl de la ligne de commande en ouvrant Flash et en passant le chemin vers le .JSFL script comme argument, mais cela ne semble pas travailler pour .fichiers jsx avec InDesign.

HTH

3
répondu George Profenza 2011-01-30 01:18:56