Hier finden Sie einige JSLs für den Betrieb von FTP über die RunProgram-Funktion von JMP 11. 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 verfügt über zwei optionale Datenströme: einen Eingabestrom mit Befehlen und einen Ausgabestrom mit Ergebnissen. Mit RunProgram kann JMP Befehle in den Eingabestream (stdin) des externen Programms schreiben und Ausgaben aus dem Ausgabestream (stdout) des externen Programms lesen.
Eine Beschreibung von RunProgram mit einigen Beispielen finden Sie im Hilfe->Skriptindex.
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 erst dann zu JMP zurückkehrt, wenn 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 etwas Geduld, es dauert 5 Sekunden, bis die 5 Pings an Ihren Computer gesendet werden):
RP = RunProgram(
Executable("PING.EXE"),
Options( {"-n 5", "localhost"} ),ReadFunction("text"));
show(RP);
Die Ausgabe sieht in etwa so aus
Ping an [::1] mit 32 Byte Daten:
Antwort von ::1: Zeit<1ms
Antwort von ::1: Zeit<1ms
Antwort von ::1: Zeit<1ms
Antwort von ::1: Zeit<1ms
Antwort von ::1: Zeit<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; Dies ist nützlich für Programme, die ohne große Aufsicht vollständig ausgeführt werden.
Der FTP-Code könnte möchte 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 bei Bedarf mit RunProgram tun, aber es wird kompliziert und schwer zu erklären und für die nächste Person schwer zu pflegen 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 auf stdout Daten verfügbar sind oder wenn stdin mehr Daten akzeptieren kann. Eines der Beispiele im Skriptindex enthält eine Liste von Befehlen, die über die WriteFunction einzeln an CMD.EXE gesendet werden. Aber es untersucht nicht wirklich die Standarddaten in der ReadFunction, sondern druckt sie nur aus.
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 Black-Dos-Box-Fenster).Es sei denn, das von Ihnen ausgeführte Programm ist cmd.exe.
Danke!
Das sieht großartig aus, allerdings habe ich einige Probleme damit, das FTP oder Ihr Ping-Beispiel über JMP laufen zu lassen.
Das Öffnen eines Programms wie Internet Explorer über runprogram funktioniert einwandfrei, aber Ping, FTP oder sogar der Verweis auf „C:\Windows\System32\ftp.exe“ zeigen überhaupt keine Aktion.
Über Ideen wäre ich sehr dankbar, da dies etwas erweiterbarer aussieht als das Beispiel von jan95
Vielen Dank für die Veröffentlichung.Es war genau das, was ich wissen musste.Ich sehe viele Verwendungsmöglichkeiten für RunProgram.