web-dev-qa-db-fra.com

Est-il possible d'exécuter des scripts JSX de Extendscript extérieur?

Typiquement, lorsque vous écrivez un script .jsx pour automatiser un produit Adobe (comme InDesign, Illustrator ou Photoshop), vous écrivez, débogez et exécutez le script à partir de l'IDE Extendcript. Est-il possible de contourner les extension et exécutez le script à partir d'un troisième programme?

Je pense que les produits Adobe ont un interprète JavaScript intégré que Extendscript peut se connecter à l'accès aux modèles d'objet Adobe et à automatiser leur logiciel. J'aimerais pouvoir vous connecter directement à cet interprète et exécuter des fichiers JSX tout comme je le ferais dans l'extension.

31
Thomas

Pour les utilisateurs Windows, vous pouvez utiliser un script VBS. Passer des arguments au script .jsx en fournissant des arguments à la commande cscript comme SO: cscript test.vbs "hello". test.vbs pourrait ressembler à:

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)

Les Wscript.Echo retournera la dernière ligne renvoyée par le fichier .jsx. Un exemple de fichier .jsx pourrait être:

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

Lorsque vous avez couru, vous devriez vous voir Illustrator (ou quel que soit le programme Adobe) alerter "Hello" puis "Test" sera renvoyé à stdout (vous devez le voir dans la fenêtre d'invite de commande).

14
jfizz

Cela fonctionne dans Windows:

"C:\Fichiers du programme (x86)\Adobe\Adobe Photoshop CS5\Photoshop.exe" C:\Complètepathto\my.jsx

Faites attention à la voie de Photoshop. Il faut citer depuis qu'il contient des espaces.

Il y a beaucoup de tours pour déterminer où Photoshop est chargé. Voici celui qui trouve tous les endroits où Photoshop a été chargé et des places à 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 ensuite traiter chaque ligne dans x.lst. Remarque: L'ensemble du "@for" doit être sur une ligne, je l'ai divisé à plusieurs lignes pour la lisibilité.

Si vous croyez qu'il n'y aura qu'un seul Photoshop (et non des éléments), vous pouvez changer "ECHO %% F" à

"%%f\..\..\Photoshop.exe" C:\completepathto\my.jsx 

La réponse directe est [~ # ~] oui [~ # ~]. Illustrator, InDesign et Photoshop peuvent tous être scriptés à travers com. Tout programme que vous faites qui peut accéder à COM (tel qu'une langue .NET, C++, BCX, Autohotkey ou PowerPro) peut indiquer Illustrator, InDesign ou Photoshop de faire des choses.

Voici un exemple pour PowerPro (vous aurez besoin du plugin COM 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

Une fois que vous utilisez la fonction COMULLE (), vous exécutez ensuite n'importe quel type de méthode ou de fonction proposée par la bibliothèque COM. Voici comment utiliser PowerPro pour dire illustrateur 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 à l'aide de PowerPro. Les boutons sont tous attachés aux fonctions COM. La plupart du temps, j'utilise les fonctions COM pour exécuter des scripts JSX externes.

enter image description here

[edit]

Il y a une autre façon! Vous pouvez utiliser le configurateur Adobe pour créer de nouveaux panneaux capables de lancer des scripts. Vous pouvez concevoir le panneau de toute façon que vous le souhaitez, et les résultats sont assez similaires à la barre d'outils PowerPro que j'ai décrite ci-dessus. En fait, je suis passé de la barre d'outils PowerPro à un panneau Adobe Configurator.

4
bgmCoder

Si vous placez les fichiers .jsx dans le bon emplacement

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 doit être facile de trouver l'équivalent sur Windows pour Photoshop and Illustrator, mais pour InDesign, il pourrait être plus facile d'ouvrir le panneau de scripts et d'ouvrir le dossier Scripts à l'aide du menu contextuel du panneau.

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

Ht

3
George Profenza