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