Voici quelques JSL pour faire fonctionner FTP via la fonction RunProgram de JMP 11. Plus d'informations sur RunProgram ci-dessous.
// this example is specific to Windows because of FTP and RunProgram issues
// you'll need to supply a proper site to open and replace
// anonymous... with proper credentials.
// for the example, build a "junk" directory in the temp folder
temp = Convert File Path( "$TEMP", windows ) || "junk"; // no trail back slash
Create Directory( temp ); // typically: "C:\Users\yourname\AppData\Local\Temp\junk"
// use JMP 11 RunProgram to run ftp; supply a ReadFunction to send all
// results to the JMP log
x = RunProgram(
Executable( "ftp" ),
Options( "-v -n" ),
ReadFunction( Function( {this}, Write( this << read ) ) )
);
x << Write( "open ftp.example.com\!n" ); // site to open
x << Write( "user anonymous YOU@yourcompany.com\!n" ); // credentials
x << Write( "dir\!n" ); // look in the log for the file listing
x << Write( "lcd " || temp || "\!n" ); // local change directory...no trail back slash!
x << Write( "get README\!n" ); // fetch file 1
x << Write( "get index.html\!n" ); // and file 2
x << Write( "disconnect\!n" ); // or just bye if nothing else to do
x << Write( "bye\!n" ); // run program terminates when ftp terminates
// when ftp signals end-of-file for reading, RunProgram must
// really be finished. Wait for it...
While( !(x << isReadEof), Wait( .01 ) );
// display the two files in the temp directory
Write( Load Text File( temp || "\!\README" ) );
Write( "\!n\!n\!n" );
Write( Load Text File( temp || "\!\index.html" ) );
Delete Directory( temp ); // clean up
Grâce à jara95 dans ce post pour les options FTP. FTP ne se comportait pas du tout sans eux.
RunProgram est une fonction JSL permettant de contrôler un programme d'interface de ligne de commande sur votre ordinateur. FTP utilise une interface de ligne de commande, pas MS-Paint. Un programme de ligne de commande a deux flux de données facultatifs : un flux d'entrée de commandes et un flux de sortie de résultats. RunProgram permet à JMP d'écrire des commandes dans le flux d'entrée du programme externe (stdin) et de lire la sortie du flux de sortie du programme externe (stdout).
RunProgram a une description dans Help->Scripting Index avec quelques exemples.
Le programme externe s'exécute de manière asynchrone à partir de JMP. Ci-dessus, la variable X est le gérer au programme externe ; ne pas écraser X jusqu'à ce que vous en ayez fini, et assurez-vous de stocker la valeur de retour RunProgram dans une variable comme X ainsi le RunProgram n'est pas immédiatement perdu.
Sauf si vous utilisez la simple interface RunProgram. L'interface simple s'exécute de manière synchrone, ce qui signifie que RunProgram ne revient pas à JMP tant que le programme externe n'est pas terminé. La valeur de retour est toute la sortie du programme externe. Voici un exemple qui devrait fonctionner sur votre ordinateur Windows (soyez patient, il faut 5 secondes pour faire les 5 pings vers votre machine) :
RP = RunProgram(
Executable("PING.EXE"),
Options( {"-n 5", "localhost"} ),ReadFunction("text"));
show(RP);
La sortie ressemblera à ceci
Ping [::1] avec 32 octets de données :
Réponse de ::1 : temps<1 ms
Réponse de ::1 : temps<1 ms
Réponse de ::1 : temps<1 ms
Réponse de ::1 : temps<1 ms
Réponse de ::1 : temps<1 ms
Statistiques de ping pour ::1 :
Paquets : envoyés = 5, reçus = 5, perdus = 0 (perte de 0 %),
Temps d'aller-retour approximatifs en millisecondes :
Minimum = 0 ms, Maximum = 0 ms, Moyenne = 0 ms
ReadFunction("text") active ce comportement ; il est utile pour les programmes qui se déroulent jusqu'à la fin sans beaucoup de supervision.
Le code FTP pourrait veulent beaucoup de surveillance. Vous voudrez peut-être examiner la sortie d'une commande avant de décider quelle doit être la commande suivante. Vous pouvez le faire avec RunProgram, si vous le devez, mais ce sera compliqué et difficile à expliquer et difficile à maintenir pour la prochaine personne. Il existe une WriteFunction, très similaire à la ReadFunction. Vous devez écrire des fonctions JSL pour la lecture et l'écriture et les coordonner. RunProgram les appellera lorsqu'il y aura des données disponibles sur stdout ou lorsque stdin pourra accepter plus de données. L'un des exemples de l'index de script contient une liste de commandes qu'il envoie à CMD.EXE, une par une, via WriteFunction. Mais il n'étudie pas vraiment les données stdout dans la ReadFunction... il suffit de les imprimer.
edit 30sep2017 : réparer la mise en forme
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />(résolu par mail...) J'ai omis de souligner que la fenêtre JSL Log doit être ouverte pour voir les résultats (et déboguer si quelque chose ne va pas).La fenêtre du journal est fermée par défaut.Affichage->Journal (windows) ou Fenêtre->Journal (mac).
En particulier, la sortie ne sera pas dans une fenêtre CMD (la fenêtre noire de la boîte à dos).Sauf si le programme que vous exécutez est cmd.exe.
Merci!
Cela a l'air génial, mais j'ai du mal à faire fonctionner le ftp, ou votre exemple de ping, via JMP.
L'ouverture d'un programme comme Internet Explorer via runprogram fonctionne bien, mais ping, ftp ou même pointant vers "C:\Windows\System32\ftp.exe" ne montre aucune action.
Toutes les idées seraient vraiment appréciées car cela semble légèrement plus extensible que l'exemple de jan95
Merci beaucoup d'avoir posté ceci.C'était exactement ce que j'avais besoin de savoir.Je peux voir beaucoup d'utilisations pour RunProgram.