Aquí hay algo de JSL para operar FTP a través de la función RunProgram de JMP 11. Más 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 resultados de salida. 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 Help->Scripting Index 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 él, y asegúrese de almacenar el valor de retorno de RunProgram en una variable como X por lo que RunProgram no se pierde inmediatamente.
A menos que utilice la sencilla interfaz RunProgram. La interfaz simple se ejecuta de forma síncrona, lo que significa que RunProgram no vuelve a JMP hasta que finaliza el programa externo. El valor devuelto es toda la salida del programa externo. Aquí hay un ejemplo que debería funcionar en su computadora con Windows (tenga paciencia, toma 5 segundos 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á algo como esto
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: Enviado = 5, Recibido = 5, Perdido = 0 (0% de pérdida),
Tiempos aproximados de ida y vuelta en milisegundos:
Mínimo = 0ms, Máximo = 0ms, Promedio = 0ms
ReadFunction("texto") habilita este comportamiento; es útil para programas que se ejecutan hasta el final sin mucha supervisión.
El codigo ftp podría quiere mucha supervisión. Es posible que desee examinar la salida de un comando antes de decidir cuál debería ser el próximo comando. Puede hacer esto con RunProgram, si es necesario, pero será complicado y difícil de explicar y difícil de mantener para la próxima persona. Hay una WriteFunction, muy similar a la ReadFunction. Tienes que escribir funciones JSL tanto para leer como para escribir 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 está estudiando los datos de salida estándar en ReadFunction... simplemente imprimiéndolos.
editar 30 de septiembre de 2017: reparar el formato
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />(resuelto por correo electrónico...) No pude señalar que la ventana de registro de JSL debe estar abierta para ver los resultados (y depurar si algo sale mal).La ventana de registro está cerrada por defecto.Ver->Registro (Windows) o Ventana->Registro (mac).
En particular, la salida no estará en una ventana CMD (la ventana negra del cuadro dos).A menos que el programa que ejecute sea cmd.exe.
¡Gracias!
Esto se ve muy bien, sin embargo, tengo algunos problemas para que ftp, o su ejemplo de ping, se ejecute a través de JMP.
Abrir un programa como Internet Explorer a través de RunProgram funciona bien, pero hacer ping, ftp o incluso apuntar a "C:\Windows\System32\ftp.exe" no muestra ninguna acción en absoluto.
Cualquier idea sería realmente apreciada ya que esto 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.