2010-05-05 7 views
2
<cfset LOCAL.cmd = expandPath('..\library\gm.exe') /> 
<cfset LOCAL.args = "convert image1.jpg image2.jpg" /> 

<cfexecute variable="gm" errorVariable="error" 
name="#LOCAL.cmd#" 
timeout="10" 
arguments="#local.args#" /> 

<cfdump var="#gm#" /> 

Ce code entraîne toujours une chaîne vide dans gm. Peu importe comment j'exécute gm avec ou sans paramètres. D'autres exemples fonctionnent très bien, comme exécuter cmd.exe ou netstat.exe comme dans l'exemple CFDocs. Je ne reçois pas d'erreurs lancées ou d'avertissements dans errorVariable, cela ne fait simplement rien.CFExécute ne pas exécuter la commande

J'ai modifié le code, cette version ne fonctionne pas non plus:

<cfset LOCAL.cmd = expandPath('..\library\gm.exe') /> 
<cfset LOCAL.args = "convert ""#variables.uploadDirectory##LOCAL.file.source#"" ""#variables.uploadDirectory#optimal-#LOCAL.file.source#""" /> 
<cfexecute errorVariable="error" 
    name="c:\windows\system32\cmd.exe" 
    timeout="10" 
    outputFile="#expandPath('.\gm.log')#" 
    arguments="/C#local.cmd# #LOCAL.args#" /> 
+0

L'affichage d'un code serait très utile. –

+0

Quelle réponse attendez-vous? –

+0

En outre, cet exemple fonctionne-t-il lorsque vous l'exécutez directement à partir de la ligne de commande, sous le même compte d'utilisateur que CF? – Leigh

Répondre

1

Sans voir le code ou la configuration de votre serveur, je suppose que vous devez vérifier les autorisations pour le compte utilisateur CF est exécuté.

Si CF est exécuté avec l'utilisateur par défaut, vous devrez peut-être créer un utilisateur ayant accès à tout ce que vous essayez de faire. Ensuite, changez le (s) service (s) à exécuter sous cet utilisateur. Alternativement, vous pouvez assigner des permissions plus libérales à la ressource que vous essayez d'accéder.

+0

Il s'exécute en tant que système local, donc il devrait avoir des permissions sur ce fichier. Tout est local sur mon système de fichiers. Je vais essayer de jouer avec les autorisations sur le fichier, ne devrait-il pas lancer une erreur de sécurité si c'était le problème? – Drew

+0

Correction, coldfusion s'exécute sous mon compte utilisateur. Donc, les autorisations ne sont définitivement pas un problème. – Drew

4

Les problèmes d'autorisation sont la cause la plus fréquente. Toutefois, si vous utilisez CF8, vous pouvez également essayer redirecting the error stream and adding an explicit terminate flag. Juste pour voir si vous obtenez une sortie ou voir un comportement différent. Les premières versions n'ont pas capturé le flux d'erreurs, ce qui a provoqué l'arrêt de certains processus. Il a été corrigé dans l'un des programmes de mise à jour CF8.

Mise à jour: Je viens de remarquer que vos chemins d'image sont relatifs. Peut-être que le programme a de la difficulté à les localiser. Essayez d'utiliser des chemins absolus pour les images.

Mise à jour: Je l'ai testé avec CF9. Cela fonctionne lorsque vous utilisez des chemins d'image absolus. Bien que la variable "gm" soit naturellement vide, puisque la sortie est dirigée vers un fichier image. Je l'ai également rencontré avec cfexecute et GraphicsMagick

<cfexecute variable="gm" 
    errorVariable="errorOut" 
    name="C:\GraphicsMagick-1.3.12-Q16\gm.exe" 
    timeout="10" 
    arguments="convert c:\art.gif c:\artCopyFromCF9.gif" /> 

<cfdump var="#variables#"> 
+0

Je cours CF9, ainsi j'ai la mise à jour qui inclut errorFile. J'ai essayé d'exécuter ceci et n'ai reçu aucune information additionnelle dans la sortie standard. – Drew

+0

@Drew - Quelques choses a) Comme Ben l'a demandé, qu'attendez-vous? b) Fonctionne-t-il réellement lorsqu'il est exécuté à partir de la ligne de commande et c) juste pour les grins, avez-vous essayé d'utiliser cmd.exe comme programme et spécifiez gm.exe dans les arguments? – Leigh

+0

J'ai posté des commentaires ci-dessus, j'ai mis à jour le code pour utiliser le répertoire cmd.exe et passer mon programme via/C. Aussi, j'ai changé cela en écho avant le chemin complet, copié cela dans une invite de commande et il a parfaitement fonctionné. – Drew

0

Je pense que l'affaire est que GM fonctionne de manière asynchrone et retourne avant qu'elle se termine. Exécution de certains tests avec outputFile/errorFile au lieu de leurs équivalents variables, suivi de cffile en lisant le fichier fileInfo sur le fichier de sortie (vide par le script de test mais observé avoir contenu à l'ouverture), je vois que l'heure du fichier de sortie avec le contenu est en fait après le dernier horodatage modifié fourni par FileInfo. Je pense que si vous affichez une variable de session ou quelque chose de ce genre qui pourrait être récupéré par un autre modèle, vous pouvez observer les résultats de l'exécution ayant rempli la variable de session, à condition que l'autre modèle s'exécute après que la variable est effectivement ensemble.

Questions connexes