Hier ist etwas JSL, um FTP über die RunProgram-Funktion von JMP 11 zu betreiben. Mehr über RunProgram weiter unten.
// 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
Dank an jara95 In dieser Beitrag für die FTP-Optionen. Ohne sie funktionierte FTP überhaupt nicht.
RunProgram ist eine JSL-Funktion zur Steuerung eines Befehlszeilenschnittstellenprogramms auf Ihrem Computer. FTP verwendet eine Befehlszeilenschnittstelle, MS-Paint nicht. Ein Befehlszeilenprogramm hat zwei optionale Datenströme: einen Eingabestrom von Befehlen und einen Ausgabestrom von Ergebnissen. RunProgram lässt JMP Befehle in den Eingabestream des externen Programms (stdin) schreiben und Ausgaben aus dem Ausgabestream des externen Programms (stdout) lesen.
RunProgram hat eine Beschreibung im Help->Scripting Index mit einigen Beispielen.
Das externe Programm wird asynchron von JMP ausgeführt. Oben die Variable X ist der handhaben zum externen Programm; nicht überschreiben X bis Sie damit fertig sind, und stellen Sie sicher, dass Sie den RunProgram-Rückgabewert in einer Variablen wie speichern X damit das RunProgram nicht sofort verloren geht.
Es sei denn, Sie verwenden die einfache RunProgram-Schnittstelle. Die einfache Schnittstelle wird synchron ausgeführt, was bedeutet, dass RunProgram nicht zu JMP zurückkehrt, bis das externe Programm beendet ist. Der Rückgabewert ist die gesamte Ausgabe des externen Programms. Hier ist ein Beispiel, das auf Ihrem Windows-Computer funktionieren sollte (haben Sie Geduld, es dauert 5 Sekunden, um die 5 Pings an Ihren Computer zu senden):
RP = RunProgram(
Executable("PING.EXE"),
Options( {"-n 5", "localhost"} ),ReadFunction("text"));
show(RP);
Die Ausgabe wird in etwa so aussehen
[::1] mit 32 Byte Daten anpingen:
Antwort von ::1: time<1ms
Antwort von ::1: time<1ms
Antwort von ::1: time<1ms
Antwort von ::1: time<1ms
Antwort von ::1: time<1ms
Ping-Statistiken für ::1:
Pakete: Gesendet = 5, Empfangen = 5, Verloren = 0 (0 % Verlust),
Ungefähre Roundtrip-Zeiten in Millisekunden:
Minimum = 0 ms, Maximum = 0 ms, Durchschnitt = 0 ms
ReadFunction("text") aktiviert dieses Verhalten; Es ist nützlich für Programme, die ohne viel Überwachung bis zum Ende ausgeführt werden.
Der FTP-Code könnte wollen viel Aufsicht. Möglicherweise möchten Sie die Ausgabe eines Befehls untersuchen, bevor Sie entscheiden, wie der nächste Befehl lauten soll. Sie können dies mit RunProgram tun, wenn Sie müssen, aber es wird kompliziert und schwer zu erklären und für die nächste Person schwer zu warten sein. Es gibt eine WriteFunction, die der ReadFunction sehr ähnlich ist. Sie müssen JSL-Funktionen sowohl zum Lesen als auch zum Schreiben schreiben und sie koordinieren. RunProgram ruft sie auf, wenn Daten auf stdout verfügbar sind oder wenn stdin mehr Daten akzeptieren kann. Eines der Beispiele im Skriptindex enthält eine Liste von Befehlen, die es einzeln über die WriteFunction an CMD.EXE sendet. Aber es untersucht nicht wirklich die stdout-Daten in der ReadFunction ... druckt sie nur.
Bearbeiten 30. September 2017: Formatierung reparieren
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />(per E-Mail gelöst...) Ich habe nicht darauf hingewiesen, dass das JSL-Protokollfenster geöffnet sein muss, um Ergebnisse anzuzeigen (und zu debuggen, wenn etwas schief geht).Das Protokollfenster ist standardmäßig geschlossen.Ansicht->Protokoll (Windows) oder Fenster->Protokoll (Mac).
Insbesondere erfolgt die Ausgabe nicht in einem CMD-Fenster (dem schwarzen DOS-Box-Fenster).Es sei denn, das Programm, das Sie ausführen, ist cmd.exe.
Danke!
Das sieht gut aus, aber ich habe einige Probleme, das FTP oder Ihr Ping-Beispiel dazu zu bringen, JMP zu durchlaufen.
Das Öffnen eines Programms wie Internet Explorer über runprogram funktioniert gut, aber Ping, FTP oder sogar das Zeigen auf "C:\Windows\System32\ftp.exe" zeigt, dass überhaupt keine Aktion stattfindet.
Irgendwelche Ideen wären wirklich willkommen, da dies etwas erweiterbarer aussieht als das Beispiel von jan95
Vielen Dank, dass Sie dies gepostet haben.Es war genau das, was ich wissen musste.Ich sehe viele Verwendungsmöglichkeiten für RunProgram.