JMP 11 の RunProgram 関数を通じて FTP を操作するための JSL をいくつか示します。 RunProgram については以下で詳しく説明します。
// 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
おかげでジャラ95でこの郵便受けFTP オプションについては、 FTP はこれらがなければまったく動作しませんでした。
RunProgram は、コンピュータ上のコマンドライン インターフェイス プログラムを制御するための JSL 関数です。 FTP はコマンド ライン インターフェイスを使用しますが、MS-Paint は使用しません。 コマンドライン プログラムには、コマンドの入力ストリームと結果の出力ストリームという 2 つのオプションのデータ ストリームがあります。 RunProgram を使用すると、JMP は外部プログラムの入力ストリーム (stdin) にコマンドを書き込み、外部プログラムの出力ストリーム (stdout) から出力を読み取ることができます。
RunProgram については、[ヘルプ]->[スクリプト索引] にいくつかの例とともに説明があります。
外部プログラムは JMP から非同期で実行されます。 上記の変数は、バツそれはハンドル外部プログラムへ。上書きしないでくださいバツ作業が完了するまで、RunProgram の戻り値を必ず次のような変数に格納してください。バツそのため、RunProgram がすぐに失われることはありません。
単純な RunProgram インターフェイスを使用しない限り。 シンプルなインターフェースは同期的に実行されます。つまり、外部プログラムが終了するまで RunProgram は JMP に戻りません。 戻り値は外部プログラムからのすべての出力です。 Windows コンピュータで動作する例を次に示します (マシンに 5 つの ping を実行するのに 5 秒かかりますので、しばらくお待ちください)。
RP = RunProgram(
Executable("PING.EXE"),
Options( {"-n 5", "localhost"} ),ReadFunction("text"));
show(RP);
出力は次のようになります
32 バイトのデータで <コンピュータのアドレス> [::1] に ping を送信します。
からの返信::1: 時間<1ms
からの返信::1: 時間<1ms
からの返信::1: 時間<1ms
からの返信::1: 時間<1ms
からの返信::1: 時間<1ms
::1: の ping 統計情報
パケット: 送信 = 5、受信 = 5、損失 = 0 (損失 0%)、
ミリ秒単位のおおよその往復時間:
最小 = 0ms、最大 = 0ms、平均 = 0ms
ReadFunction("text") はこの動作を有効にします。これは、多くの監視なしで完了まで実行されるプログラムに役立ちます。
FTPコードかもしれないたくさんの監督が欲しい。 次のコマンドを決定する前に、コマンドの出力を調べることをお勧めします。 必要に応じて、RunProgram を使用してこれを行うこともできますが、複雑で説明が難しく、次の人が保守するのは困難です。 ReadFunction とよく似た WriteFunction があります。 読み取りと書き込みの両方の JSL 関数を作成し、それらを調整する必要があります。 RunProgram は、stdout に利用可能なデータがある場合、または stdin がより多くのデータを受け入れることができる場合に、それらを呼び出します。 スクリプト索引内の例の 1 つは、WriteFunction を介して CMD.EXE に一度に 1 つずつ送信するコマンドのリストを持っています。 ただし、実際には ReadFunction の stdout データを調べているわけではなく、単に出力しているだけです。
2017 年 9 月 30 日編集: フォーマットの修復
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />(メールで解決しました...) 結果を確認するには (そして何か問題が発生した場合はデバッグするには)、JSL ログ ウィンドウを開く必要があることを指摘し損ねました。ログ ウィンドウはデフォルトでは閉じられています。[表示] -> [ログ] (Windows) または [ウィンドウ] -> [ログ] (Mac)。
特に、出力は CMD ウィンドウ (黒い dos-box ウィンドウ) には表示されません。実行するプログラムが cmd.exe でない限り。
ありがとう!
これは素晴らしく見えますが、ftp または ping のサンプルを JMP 経由で実行するのに少し問題があります。
runprogram を使用して Internet Explorer などのプログラムを開くと正常に動作しますが、ping、ftp、または「C:\Windows\System32\ftp.exe」をポイントしても、何もアクションが発生しません。
これはjan95の例よりもわずかに拡張可能に見えるので、どんなアイデアも大歓迎です。
投稿していただき本当にありがとうございます。それはまさに私が知りたかったことだった。RunProgram の用途はたくさんあります。