Ecco alcuni JSL per utilizzare FTP tramite la funzione RunProgram di JMP 11. Maggiori informazioni su RunProgram di seguito.
// 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
Grazie a jara95 In questo post per le opzioni FTP. FTP non si comportava affatto senza di loro.
RunProgram è una funzione JSL per controllare un programma di interfaccia della riga di comando sul tuo computer. FTP utilizza un'interfaccia a riga di comando, MS-Paint no. Un programma da riga di comando ha due flussi di dati opzionali: un flusso di input di comandi e un flusso di output di risultati. RunProgram consente a JMP di scrivere comandi nel flusso di input del programma esterno (stdin) e di leggere l'output dal flusso di output del programma esterno (stdout).
RunProgram ha una descrizione nella Guida->Indice degli script con alcuni esempi.
Il programma esterno viene eseguito in modo asincrono da JMP. Sopra, la variabile X è il maniglia al programma esterno; non sovrascrivere X finché non hai finito e assicurati di memorizzare il valore restituito da RunProgram in una variabile come X quindi il RunProgram non viene perso immediatamente.
A meno che non utilizzi la semplice interfaccia RunProgram. La semplice interfaccia viene eseguita in modo sincrono, il che significa che RunProgram non ritorna a JMP finché il programma esterno non termina. Il valore restituito è tutto l'output del programma esterno. Ecco un esempio che dovrebbe funzionare sul tuo computer Windows (sii paziente, ci vogliono 5 secondi per eseguire i 5 ping sul tuo computer):
RP = RunProgram(
Executable("PING.EXE"),
Options( {"-n 5", "localhost"} ),ReadFunction("text"));
show(RP);
L'output sarà simile a questo
Ping [::1] con 32 byte di dati:
Risposta da ::1: tempo<1ms
Risposta da ::1: tempo<1ms
Risposta da ::1: tempo<1ms
Risposta da ::1: tempo<1ms
Risposta da ::1: tempo<1ms
Statistiche ping per ::1:
Pacchetti: inviati = 5, ricevuti = 5, persi = 0 (0% di perdita),
Tempi approssimativi di andata e ritorno in millisecondi:
Minimo = 0ms, Massimo = 0ms, Media = 0ms
ReadFunction("text") abilita questo comportamento; è utile per i programmi che vengono eseguiti fino al completamento senza molta supervisione.
Il codice FTP Potrebbe vuole molta supervisione. Potresti voler esaminare l'output di un comando prima di decidere quale dovrebbe essere il comando successivo. Puoi farlo con RunProgram, se necessario, ma sarà complicato e difficile da spiegare e difficile da mantenere per la persona successiva. Esiste una WriteFunction, molto simile alla ReadFunction. Devi scrivere funzioni JSL sia per la lettura che per la scrittura e farle coordinare. RunProgram li chiamerà quando ci sono dati disponibili su stdout o quando stdin può accettare più dati. Uno degli esempi nell'indice degli script contiene un elenco di comandi che invia a CMD.EXE, uno alla volta, tramite WriteFunction. Ma in realtà non sta studiando i dati stdout nella ReadFunction... li sta semplicemente stampando.
modifica 30 settembre 2017: ripara la formattazione
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />(risolto via email...) Non ho sottolineato che la finestra del registro JSL deve essere aperta per visualizzare i risultati (ed eseguire il debug se qualcosa va storto).Per impostazione predefinita la finestra di registro è chiusa.Visualizza->Registro (Windows) o Finestra->Registro (mac).
In particolare, l'output non sarà in una finestra CMD (la finestra nera del dos-box).A meno che il programma che esegui non sia cmd.exe.
Grazie!
Sembra fantastico, tuttavia ho qualche problema a far funzionare l'ftp, o il tuo esempio di ping, tramite JMP.
L'apertura di un programma come Internet Explorer tramite runprogram funziona correttamente, ma il ping, l'ftp o anche il puntamento a "C:\Windows\System32\ftp.exe" non mostra alcuna azione in corso.
Qualsiasi idea sarebbe davvero apprezzata poiché sembra leggermente più estensibile rispetto all'esempio di Jan95
Grazie mille per aver pubblicato questoEra esattamente quello che avevo bisogno di sapere.Vedo molti usi per RunProgram.