いつもお世話になっております。
前回のクラスの話の件は、大変勉強になりました。現在も勉強中です。
今回、コンソールアプリケーションを、DOS窓を出さずに自由に制御出来たら…と考えています。
単に、単発(?)のコンソールアプリケーションからの出力を取得して、その内容を処理するという事は、
下記のコンポーネントを使う事で出来ました。例えばDIRやipconfigと言った類です。
http://www6.airnet.ne.jp/~sone_san/delphi/cgi-bin/ssi.cgi?miscella.html#MI0020
今回は、それとは違う事をしたいのです。
telnet.exe や ftp.exe 等の、コマンドを実行後にサブコマンドを打ち込んでいく類のアプリを
出力をリアルタイムに取得しながら、制御していきたいのです。
例えばの話ですが、
ftp.exe を実行してUSER・PASSを入力し、その後にファイル一覧取得して処理する。
その後、別のサブコマンドを・・・
という事を考えています。
例ではftp.exe等をあげましたが、通信をさせる事が目的ではなく、
コンソールアプリケーションのサブコマンドを操りたい…と言った感じが目的となります。
NETで調べてはみましたが、自分では情報を得る事が出来ませんでした。
ご教授を頂けると大変助かります。
宜しくお願いします。
OS:WindowsXP SP2
Delphi6 Personal
>今回、コンソールアプリケーションを、DOS窓を出さずに自由に制御出来たら…と考えています。
少なくともWind2k,XPの場合,DOS窓というのはありません.
「コマンドプロンプト」ですね.
この「コマンドプロンプト」上で動作するアプリケーションが「コンソールア
プリケーション」です.例えば[ファイル名を指定して実行]でftp.exeを実行
した時のことを考えてみて下さい.
質問の文章をもう一度考えてみてはいかがでしょうか.
(長ければいいというわけではないと思います.投稿注意のサイトにあるよう
に希望の動作を箇条書きにするのが一番です.プログラムの実行は順番なの
ですから)
「リアルタイムに取得」の状態や「サブコマンド」というのも,私にはわか
りません.
自分なりに伝えたい事を書いたつもりでしたが、説明が下手で書いた「つもり」になってました。
説明が足りず申し訳ありませんでした。
> 例えば[ファイル名を指定して実行]でftp.exeを実行した時のことを考えてみて下さい
そちらを例に、1から書き直したいと思います。
ファイル名を指定して実行でftp.exeを実行すると、
コマンドプロンプトが表示されます。
そこには「ftp>」というプロンプトが表示されているはずです。
その状態で入力出来るコマンドをサブコマンドと言います。
openサブコマンドを入力したりdirサブコマンドを実行すると、
結果として下記内容が表示されると思います。
FTPサーバを立ち上げて、ルートディレクトリに
「ファイル一覧取得TEST」ファイルを置いた例です。
--------------------------------------------------------------------------
ftp> open localhost (←openサブコマンド)
Connected to localhost.
220-Jgaa's Fan Club FTP service
WarFTPd 1.82.00-RC1 (Mar 17 2003) Ready
(C)opyright 1996 - 2003 by Jarle (jgaa) Aase - all rights reserved.
220 Please enter your user name.
User (localhost:(none)): test
331 User name okay, need password.
Password: test
230 User logged in.
ftp> dir (←dirサブコマンド)
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls (158 bytes).
total 3
drwxrw-rw- 1 root root 0 Nov 7 20:35 .
drwxrw-rw- 1 root root 0 Nov 23 06:37 ..
-rwxrw-rw- 1 root root 0 Feb 25 2002 ファイル一覧取得TEST
226 Transfer complete. 158 bytes in 0.00 sec. (154.297 Kb/s)
ftp: 158 bytes received in 0.00Seconds 158000.00Kbytes/sec.
--------------------------------------------------------------------------
コマンドプロンプトを表示させずに、サブコマンドを自動で実行させて、
上記のような表示結果が欲しいのです。
RedirectExec('ipconfig','',StdOut,StdErr);
memo1.Lines.Add(StdOut);
RedirectExec('ftp.exe','',StdOut,StdErr);
memo2.Lines.Add(StdOut);
参考サイトでダウンロードした「ConsoleRedirect.pas」を使って上記のようにみましたが、
ipconfigの結果なら取得出来たのですが、ftp.exeを実行した結果(この場合「ftp>」という表示)
の取得が出来ませんでした。
自分の力では、これ以上情報を探し出す事が出来ませんでした。
う〜ん,残念.これは私にはわかりません.
取敢えず,ftpコマンドの場合,そのサブコマンドの文字列をファイルに保存
しておけば,
'ftp -s:'+ファイル名
として,サブコマンドも含めて実行できることだけは確認しました.
引き続きやってみました.
CommandPathで指定したファイルに以下のコマンドを記述しました.
open FTPサーバ名
ユーザ名
パスワード
dir
そして,以下を実行しました.サーバのrootのリストを取得できました.
この'-s:ファイル名は,googleで「FTPコマンド」で検索した結果です.
(ただし,1行ごとに改行が入ってしまっています)
RedirectExec('ftp -s:'+CommandPath,'',StdOut,StdErr);
振り返ってみると,単なるftpコマンドの使い方の問題だったようですね.
そうですか,「サブコマンド」というんですか,勉強になりました.
惑わされてしまいました.
> 振り返ってみると,単なるftpコマンドの使い方の問題だったようですね.
特定のアプリがどのようなコマンドラインパラメータをサポートしているか、
とか、
ReadLn() 相当でどんなパラメータを読みとるか、は当然アプリ依存なので一般解など
ありませんよね。その意味で、このすれの質問には一般解はありません。
>ReadLn() 相当でどんなパラメータを読みとるか、は当然アプリ依存なので一般解など
>ありませんよね。その意味で、このすれの質問には一般解はありません。
ということですね.かなものさんは,たまたまftpがうまくいかなかったので,
汎用的にできないかと考えたのではないかと思います.
でも,残念ながら...ケースバイケースでいきましょう.
以前,Delphi MLで「他のアプリの操作」の汎用コンポなんていう質問が
ありましたが,ちょっとそれに近いかも知れませんね.
レスを頂きありがとう御座います。
'ftp -s:'+ファイル名 のやり方ですと、作業手順が固定されてしまいます。
そうではなく、任意にサブコマンドを実行出来ないだろうか?というのを考えていました。
例えばですが、フォームにUSERとPASSを入力すれば、自動でログインし、
DIRボタンを押せばファイル一覧を、GETボタンを押せばファイル取得などをして、
それぞれサブコマンドの、個々の結果が文字列として取得出来れば、
GUIフロントエンドらしきもの(?)が作れると思ったからです。
ftp.exe や telnet.exe 等の、サブコマンドを実行するような類のアプリで、
上記内容が出来れば…と考えて調べてみましたが、一向に進まずこちらに質問させて頂きました。
どうやら、お話の内容から察するに、出来るとしてもかなり難しいようです…。
>'ftp -s:'+ファイル名 のやり方ですと、作業手順が固定されてしまいます。
>そうではなく、任意にサブコマンドを実行出来ないだろうか?というのを考えていました。
(1) 入力用のFormを表示して,ホスト名,ユーザ名等を入力
(2) 入力した値をファイルに保存
(3) RedirectExec を実行.不要ならサブコマンドを保存したファイルを削除
という方法ではダメなんですか.
ここまで書いて,気づいたのですが,ftp,telntet関係なら,特にこれまで
の方法にこだわらなければ,Indy等を使用を考えてもいいのではないてしょ
うか.IndyのDemoにもあったと思います...
結局は,どんな(DOS)のコマンドによるかは,ケースバイケースということに
なりますね.
レスありがとう御座います。
冒頭にも書かせて頂きましたが、通信する事が目的ではありません。
ftpやtelnetは、わかりやすい例として上げさせて頂きました。
もう少し具体的な内容としましては、通信をしないコマンドプロンプト上で動くアプリや、
複雑に書かれているperlなどを、主な対象に考えています。
それらにGUIの機能を加えるには、方法さえ確立すれば、GUIフロントエンドらしきものがDelphiで作れないか?
と考えたのです。
-------------------------------------
Indyはインストールしてみましたが、あれもあまり良く分かっていません…。
機能は豊富なのはわかるのですが、まだまだ勉強不足です。
ツイート | ![]() |