Aquí hay algo de JSL para operar FTP a través de la función RunProgram de JMP 11. Más información sobre RunProgram a continuación.
// 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
Gracias a jara95 en esta publicación para las opciones de FTP. FTP no se comportaba en absoluto sin ellos.
RunProgram es una función JSL para controlar un programa de interfaz de línea de comandos en su computadora. FTP utiliza una interfaz de línea de comandos, MS-Paint no. Un programa de línea de comandos tiene dos flujos de datos opcionales: un flujo de entrada de comandos y un flujo de salida de resultados. RunProgram permite que JMP escriba comandos en el flujo de entrada del programa externo (stdin) y lea la salida del flujo de salida del programa externo (stdout).
RunProgram tiene una descripción en Ayuda->Índice de secuencias de comandos con algunos ejemplos.
El programa externo se ejecuta de forma asíncrona desde JMP. Arriba, la variable X es el manejar al programa externo; no sobrescribir X hasta que haya terminado con esto, y asegúrese de almacenar el valor de retorno de RunProgram en una variable como X por lo que el RunProgram no se pierde inmediatamente.
A menos que utilice la sencilla interfaz RunProgram. La interfaz simple se ejecuta de forma sincrónica, lo que significa que RunProgram no regresa a JMP hasta que finaliza el programa externo. El valor de retorno es toda la salida del programa externo. Aquí hay un ejemplo que debería funcionar en su computadora con Windows (tenga paciencia, se necesitan 5 segundos para hacer los 5 pings a su máquina):
RP = RunProgram(
Executable("PING.EXE"),
Options( {"-n 5", "localhost"} ),ReadFunction("text"));
show(RP);
La salida se verá así
Haciendo ping a [::1] con 32 bytes de datos:
Respuesta de ::1: tiempo<1ms
Respuesta de ::1: tiempo<1ms
Respuesta de ::1: tiempo<1ms
Respuesta de ::1: tiempo<1ms
Respuesta de ::1: tiempo<1ms
Estadísticas de ping para ::1:
Paquetes: enviados = 5, recibidos = 5, perdidos = 0 (0% de pérdida),
Tiempos aproximados de ida y vuelta en milisegundos:
Mínimo = 0 ms, Máximo = 0 ms, Promedio = 0 ms
ReadFunction("text") habilita este comportamiento; Es útil para programas que se ejecutan hasta su finalización sin mucha supervisión.
El código FTP podría Quiere mucha supervisión. Es posible que desee examinar el resultado de un comando antes de decidir cuál debería ser el siguiente comando. Puede hacer esto con RunProgram, si es necesario, pero será complicado y difícil de explicar y difícil de mantener para la siguiente persona. Existe una WriteFunction, muy similar a la ReadFunction. Tienes que escribir funciones JSL tanto para lectura como para escritura y hacer que se coordinen. RunProgram los llamará cuando haya datos disponibles en stdout o cuando stdin pueda aceptar más datos. Uno de los ejemplos en el índice de secuencias de comandos tiene una lista de comandos que envía a CMD.EXE, uno a la vez, a través de WriteFunction. Pero en realidad no se trata de estudiar los datos estándar en ReadFunction... simplemente imprimirlos.
editar 30sep2017: reparar formato
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />(resuelto por correo electrónico...) No señalé que la ventana de registro JSL debe estar abierta para ver los resultados (y depurar si algo sale mal).La ventana de registro está cerrada de forma predeterminada.Ver->Registro (windows) o Ventana->Registro (mac).
En particular, la salida no estará en una ventana CMD (la ventana negra de dos-box).A menos que el programa que ejecute sea cmd.exe.
¡Gracias!
Esto se ve genial, sin embargo, estoy teniendo problemas para ejecutar el ftp, o su ejemplo de ping, a través de JMP.
Abrir un programa como Internet Explorer a través del programa de ejecución funciona bien, pero hacer ping, ftp o incluso apuntar a "C:\Windows\System32\ftp.exe" no muestra ninguna acción.
Cualquier idea sería realmente apreciada ya que parece un poco más extensible que el ejemplo de jan95.
Muchas gracias por publicar esto.Era exactamente lo que necesitaba saber.Puedo ver muchos usos para RunProgram.