コンソールアプリケーションを制御するには?


かなもの  2005-12-10 10:28:35  No: 19174

いつもお世話になっております。

前回のクラスの話の件は、大変勉強になりました。現在も勉強中です。

今回、コンソールアプリケーションを、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


Mr.XRAY  URL  2005-12-11 00:25:19  No: 19175

>今回、コンソールアプリケーションを、DOS窓を出さずに自由に制御出来たら…と考えています。

少なくともWind2k,XPの場合,DOS窓というのはありません.
「コマンドプロンプト」ですね.
この「コマンドプロンプト」上で動作するアプリケーションが「コンソールア
プリケーション」です.例えば[ファイル名を指定して実行]でftp.exeを実行
した時のことを考えてみて下さい.

質問の文章をもう一度考えてみてはいかがでしょうか.
(長ければいいというわけではないと思います.投稿注意のサイトにあるよう
に希望の動作を箇条書きにするのが一番です.プログラムの実行は順番なの
ですから)

「リアルタイムに取得」の状態や「サブコマンド」というのも,私にはわか
りません.


かなもの  2005-12-11 04:55:26  No: 19176

自分なりに伝えたい事を書いたつもりでしたが、説明が下手で書いた「つもり」になってました。
説明が足りず申し訳ありませんでした。

> 例えば[ファイル名を指定して実行]で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>」という表示)
の取得が出来ませんでした。

自分の力では、これ以上情報を探し出す事が出来ませんでした。


Mr.XRAY  URL  2005-12-11 08:36:58  No: 19177

う〜ん,残念.これは私にはわかりません.
取敢えず,ftpコマンドの場合,そのサブコマンドの文字列をファイルに保存
しておけば,
    'ftp -s:'+ファイル名
として,サブコマンドも含めて実行できることだけは確認しました.


Mr.XRAY  URL  2005-12-11 23:17:44  No: 19178

引き続きやってみました.
CommandPathで指定したファイルに以下のコマンドを記述しました.

open FTPサーバ名
ユーザ名
パスワード
dir

そして,以下を実行しました.サーバのrootのリストを取得できました.
この'-s:ファイル名は,googleで「FTPコマンド」で検索した結果です.
(ただし,1行ごとに改行が入ってしまっています)

RedirectExec('ftp -s:'+CommandPath,'',StdOut,StdErr);


Mr.XRAY  URL  2005-12-11 23:26:05  No: 19179

振り返ってみると,単なるftpコマンドの使い方の問題だったようですね.
そうですか,「サブコマンド」というんですか,勉強になりました.
惑わされてしまいました.


りおりお  2005-12-12 00:09:05  No: 19180

> 振り返ってみると,単なるftpコマンドの使い方の問題だったようですね.

特定のアプリがどのようなコマンドラインパラメータをサポートしているか、
とか、
ReadLn() 相当でどんなパラメータを読みとるか、は当然アプリ依存なので一般解など
ありませんよね。その意味で、このすれの質問には一般解はありません。


Mr.XRAY  URL  2005-12-12 02:12:44  No: 19181

>ReadLn() 相当でどんなパラメータを読みとるか、は当然アプリ依存なので一般解など
>ありませんよね。その意味で、このすれの質問には一般解はありません。

ということですね.かなものさんは,たまたまftpがうまくいかなかったので,
汎用的にできないかと考えたのではないかと思います.
でも,残念ながら...ケースバイケースでいきましょう.

以前,Delphi MLで「他のアプリの操作」の汎用コンポなんていう質問が
ありましたが,ちょっとそれに近いかも知れませんね.


かなもの  2005-12-12 19:25:44  No: 19182

レスを頂きありがとう御座います。

'ftp -s:'+ファイル名 のやり方ですと、作業手順が固定されてしまいます。
そうではなく、任意にサブコマンドを実行出来ないだろうか?というのを考えていました。

例えばですが、フォームにUSERとPASSを入力すれば、自動でログインし、
DIRボタンを押せばファイル一覧を、GETボタンを押せばファイル取得などをして、
それぞれサブコマンドの、個々の結果が文字列として取得出来れば、
GUIフロントエンドらしきもの(?)が作れると思ったからです。

ftp.exe や telnet.exe 等の、サブコマンドを実行するような類のアプリで、
上記内容が出来れば…と考えて調べてみましたが、一向に進まずこちらに質問させて頂きました。

どうやら、お話の内容から察するに、出来るとしてもかなり難しいようです…。


Mr.XRAY  URL  2005-12-12 20:01:25  No: 19183

>'ftp -s:'+ファイル名 のやり方ですと、作業手順が固定されてしまいます。
>そうではなく、任意にサブコマンドを実行出来ないだろうか?というのを考えていました。

(1) 入力用のFormを表示して,ホスト名,ユーザ名等を入力
(2) 入力した値をファイルに保存
(3) RedirectExec を実行.不要ならサブコマンドを保存したファイルを削除

という方法ではダメなんですか.


Mr.XRAY  URL  2005-12-12 20:13:30  No: 19184

ここまで書いて,気づいたのですが,ftp,telntet関係なら,特にこれまで
の方法にこだわらなければ,Indy等を使用を考えてもいいのではないてしょ
うか.IndyのDemoにもあったと思います...

結局は,どんな(DOS)のコマンドによるかは,ケースバイケースということに
なりますね.


かなもの  2005-12-12 20:46:09  No: 19185

レスありがとう御座います。

冒頭にも書かせて頂きましたが、通信する事が目的ではありません。
ftpやtelnetは、わかりやすい例として上げさせて頂きました。

もう少し具体的な内容としましては、通信をしないコマンドプロンプト上で動くアプリや、
複雑に書かれているperlなどを、主な対象に考えています。

それらにGUIの機能を加えるには、方法さえ確立すれば、GUIフロントエンドらしきものがDelphiで作れないか?
と考えたのです。

-------------------------------------
Indyはインストールしてみましたが、あれもあまり良く分かっていません…。
機能は豊富なのはわかるのですが、まだまだ勉強不足です。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加