Voici quelques JSL pour faire fonctionner FTP via la fonction RunProgram de JMP 11. En savoir plus 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 fonctionnait 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, contrairement à MS-Paint. Un programme de ligne de commande dispose de deux flux de données facultatifs : un flux de commandes d'entrée et un flux de résultats de sortie. 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 Aide->Index de script avec quelques exemples.
Le programme externe s'exécute de manière asynchrone à partir de JMP. Ci-dessus, la variable X est le poignée au programme externe ; ne pas écraser X jusqu'à ce que vous en ayez terminé, et assurez-vous de stocker la valeur de retour RunProgram dans une variable comme X donc le RunProgram n'est pas immédiatement perdu.
Sauf si vous utilisez l'interface simple 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 correspond à la totalité de 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 sur votre machine) :
RP = RunProgram(
Executable("PING.EXE"),
Options( {"-n 5", "localhost"} ),ReadFunction("text"));
show(RP);
La sortie ressemblera à ceci
Pinging [::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 : délai < 1 ms
Réponse de : 1 : temps < 1 ms
Statistiques ping pour ::1:
Paquets : envoyés = 5, reçus = 5, perdus = 0 (0 % de perte),
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 terminent sans beaucoup de supervision.
Le code FTP pourrait veulent beaucoup de surveillance. Vous souhaiterez peut-être examiner le résultat d’une commande avant de décider quelle devrait ê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 personne suivante. Il existe une fonction WriteFunction, très similaire à la fonction ReadFunction. Vous devez écrire des fonctions JSL pour la lecture et l'écriture et les faire coordonner. RunProgram les appellera lorsque des données seront disponibles sur la sortie standard 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 à la fois, via WriteFunction. Mais il ne s'agit pas vraiment d'étudier les données de la sortie standard dans ReadFunction... il suffit de les imprimer.
modifier le 30 septembre 2017 : réparer le formatage
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />(résolu par email...) Je n'ai pas souligné que la fenêtre du journal JSL doit être ouverte pour voir les résultats (et déboguer en cas de problème).La fenêtre du journal est fermée par défaut.Affichage->Journal (windows) ou Fenêtre->Journal (mac).
En particulier, la sortie ne se fera pas dans une fenêtre CMD (la fenêtre noire dos-box).Sauf si le programme que vous exécutez est cmd.exe.
Merci!
Cela a l'air génial, mais j'ai quelques difficultés à faire fonctionner le ftp, ou votre exemple de ping, via JMP.
L'ouverture d'un programme comme Internet Explorer via runprogram fonctionne correctement, mais ping, ftp ou même pointer 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 janvier 95
Merci beaucoup d'avoir posté ceci.C'était exactement ce que j'avais besoin de savoir.Je peux voir de nombreuses utilisations pour RunProgram.