C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: C#でコマンド


(過去ログ 62 を表示中)

[トピック内 13 記事 (1 - 13 表示)]  << 0 >>

■35504 / inTopicNo.1)  C#でコマンド
  
□投稿者/ りゅう (1回)-(2009/05/06(Wed) 17:57:48)

分類:[C#] 

C#にてDOSコマンドを実行し、その結果の一部を表示するようにしたく。
      下記プログラムではバッチファイルに記述したDOSコマンドを実行はするのですが
      結果とともに 実行するコマンドパスとバッチファイルに記載したコマンド
     (今回は試しにipconfigを実行)も表示してしまいます。
      p.StandardOutput.ReadToEnd() を使っているので全部表示してしまいます。
      @ipconfigのコマンドを実行した場合で、応答結果のみを表示する方法
      A たとえばIP Address. . . . . . . . . . . . : 192.168.11.* の行のみを表示する方法
      等を教えていただきたく よろしくお願いします。

      Process p = new Process();
p.StartInfo.FileName = ("C:\\WINDOWS\\system32\\ipconfig.bat") ;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = false;
p.StartInfo.RedirectStandardOutput = true;
 p.Start();
//text出力 
string output = p.StandardOutput.ReadToEnd(); // 出力を取得(参照の宣言のみ)
p.WaitForExit();
textBox1.Text = output ; // 表示(出力を実際に取得)
引用返信 編集キー/
■35505 / inTopicNo.2)  Re[1]: C#でコマンド
□投稿者/ オショウ (172回)-(2009/05/06(Wed) 18:05:51)
No35504 (りゅう さん) に返信
> C#にてDOSコマンドを実行し、その結果の一部を表示するようにしたく。

  http://dobon.net/vb/dotnet/process/standardoutput.html

  ここの掲載されたコーディングとは異なりますね!
  一度、お試し下さい。

以上。
引用返信 編集キー/
■35506 / inTopicNo.3)  Re[1]: C#でコマンド
□投稿者/ Hongliang (376回)-(2009/05/06(Wed) 18:08:07)
適当に ReadLine なり Read なりで読み込んでいけばいいんじゃないっすか。
ReadToEnd してからこちらで全部解析でもいいですが。
引用返信 編集キー/
■35510 / inTopicNo.4)  Re[2]: C#でコマンド
□投稿者/ やじゅ (986回)-(2009/05/06(Wed) 21:49:02)
やじゅ さんの Web サイト
> ■No35504 (りゅう さん) に返信

出力情報から、正規表現などで解析して取得する。

string output = process.StandardOutput.ReadToEnd();
Regex regex = new Regex(@"IP Address.+:\s([0-9.]+)\s");
Match m = regex.Match(output);
if ( m.Success ) {
Console.WriteLine("IP Address:{0}",m.Groups[1]);
}

http://www.melma.com/backnumber_120830_3835575/
引用返信 編集キー/
■35519 / inTopicNo.5)  Re[3]: C#でコマンド
□投稿者/ ちゃっぴ (233回)-(2009/05/07(Thu) 16:09:40)
ちゃっぴ さんの Web サイト
Windows の世界においては commands 出力結果を加工して利用するのは基本的に NG ですね。

その理由はいろいろあります。

・ Commands 出力結果の互換性を Microsoft が保証していない
Windows の互換性維持は API level までです。
事実、Windows Vista では commands の出力結果の多くが日本語化されたおかげでこけるものが多いですね。

・ Console Applicaion の仕様がめちゃくちゃ
仕様改変とかいろいろあったり、UNIX の command と下手に互換性を取ろうとしたおかげで、Windows の console applications はもはや無法地帯です。

今回質問を行った本当の目的は、おそらく IP Address を取得したいということだと思いますが、ipconfig.exe を利用しなくても取得できます。他の方法としては

・ WMI
ipconfig.exe で取得できる内容は、Win32_NetworkAdapterConfiguration で取得できます。
ただし、複数の IP addresses が設定されている場合、実際に通信で利用される IP address は特定できないので注意が必要です。

・ WinSock
TCP connection を張っている状態であれば、getsockname function を呼び出すことで確実にその通信で利用している IP address を取得することが可能です。

引用返信 編集キー/
■35520 / inTopicNo.6)  Re[4]: C#でコマンド
□投稿者/ みきぬ (417回)-(2009/05/07(Thu) 16:30:34)
> 今回質問を行った本当の目的は、おそらく IP Address を取得したいということだと思いますが、
という前提で。
 
.NET TIPS : ローカル・コンピュータのIPアドレスを取得するには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/778getmyipaddress/getmyipaddress.html
引用返信 編集キー/
■35521 / inTopicNo.7)  Re[4]: C#でコマンド
□投稿者/ aetos (136回)-(2009/05/07(Thu) 17:24:06)
aetos さんの Web サイト
No35519 (ちゃっぴ さん) に返信
> ただし、複数の IP addresses が設定されている場合、実際に通信で利用される IP address は特定できないので注意が必要です。

できないんでしたっけ?
WMI だけではできない、という意味?
それ以外の方法を併用しても無理、という意味?
引用返信 編集キー/
■35523 / inTopicNo.8)  Re[5]: C#でコマンド
□投稿者/ ちゃっぴ (234回)-(2009/05/07(Thu) 18:40:38)
ちゃっぴ さんの Web サイト
No35521 (aetos さん) に返信
> ■No35519 (ちゃっぴ さん) に返信
>> ただし、複数の IP addresses が設定されている場合、実際に通信で利用される IP address は特定できないので注意が必要です。
>
> できないんでしたっけ?
> WMI だけではできない、という意味?
> それ以外の方法を併用しても無理、という意味?

Routing table 舐めればできないこともないです。
Windows の場合それだけでは無いけどね。
引用返信 編集キー/
■35525 / inTopicNo.9)  Re[6]: C#でコマンド
□投稿者/ りゅう (2回)-(2009/05/08(Fri) 06:28:34)

りゅうです。
みなさん貴重なご意見ありがとうございます。。
大変参考になりました。

ですが、、、完全初心者なので理解するのにまだまだ勉強しなければという状況です。
今回の質問に関してですが、
ReadLineで読み込みとかReadToEnd してから全部解析という方法を
検討しているのですが、具体的なソースコード等でアドバイスいただけないでしょうか?
(その他簡単な方法でもいいです)
というのも
今回の質問の例ではIPアドレスを取得する例で質問させていただきましたが、
実はそうではなく
コマンドライン上で実行する別のコマンドライン実行型のアプリの応答
をEXCELに取り込んでデータを解析したいと考えています。
そのためにコマンドライン命令に対する応答の数値(今回の目的では)のみを取り込む方法を
迷っています。
以上 よろしくお願いします。


引用返信 編集キー/
■35527 / inTopicNo.10)  Re[7]: C#でコマンド
□投稿者/ .SHO (817回)-(2009/05/08(Fri) 09:12:42)
No35525 (りゅう さん) に返信

> 今回の質問の例ではIPアドレスを取得する例で質問させていただきましたが、
> 実はそうではなく

ならば、そちらを説明してもらわなければ、コードは示せません。
引用返信 編集キー/
■35528 / inTopicNo.11)  Re[7]: C#でコマンド
□投稿者/ みきぬ (418回)-(2009/05/08(Fri) 09:19:35)
> 具体的なソースコード等でアドバイスいただけないでしょうか?
>
No.35505No.35510 の回答は具体的なソースコードによるアドバイスだと思うのですが、それでは不足ということですか?
だとしたら何が不足しているのか、具体的に説明してもらえないでしょうか。
引用返信 編集キー/
■35558 / inTopicNo.12)  Re[8]: C#でコマンド
□投稿者/ りゅう (3回)-(2009/05/09(Sat) 07:35:11)
No35528 (みきぬ さん) に返信
>>具体的なソースコード等でアドバイスいただけないでしょうか?
>>
> No.35505No.35510 の回答は具体的なソースコードによるアドバイスだと思うのですが、それでは不足ということですか?
> だとしたら何が不足しているのか、具体的に説明してもらえないでしょうか。

りゅうです。
誤解をまねく質問のしかたですみません。
本来のコマンドライン上で動かす別のコマンドライン実行型のアプリ
というのが一般的なものではなく、会社で別のだれかが作成したもので
非常に説明が困難でしたのでIPアドレスを例してして質問させていただきました。

No.35505No.35510 さんの回答は非常に参考にさせていただきました。
ですが私には35506さんのアドバイスが非常にきになっていました。

>当に ReadLine なり Read なりで読み込んでいけばいいんじゃないっすか。
>ReadToEnd してからこちらで全部解析でもいいですが。

この方法であれば非常に簡単でできるのかな?と考えまして
ReadLineをつかって読み込んでいく方法の詳細(ここのソースの具体例)
を知りたいと思い、再度、質問させていただきました。

よく考えば 具体的にReadLineもしくはReadなりで読み込む
とまでアドバイスいただいていますので、これ以上なにを望むの??
と思われるような質問だったかもしれません。

もう少し勉強してみます。
みなさん回答ありがとうございました。





解決済み
引用返信 編集キー/
■35560 / inTopicNo.13)  Re[9]: C#でコマンド
□投稿者/ よねKEN (329回)-(2009/05/09(Sat) 12:10:05)
2009/05/09(Sat) 12:11:57 編集(投稿者)

> よく考えば 具体的にReadLineもしくはReadなりで読み込む
> とまでアドバイスいただいていますので、これ以上なにを望むの??
> と思われるような質問だったかもしれません。

誤解があるようなのでコメントしますと、
No35506のHongliangさんの回答の一例がNo35510 のやじゅさんの回答のコード例です。

で、実際にあなたの対象とするコンソールアプリに対して適用するための具体的な方法は、
今あなたの提示されている範囲の情報ではこれ以上のアドバイスが不可能ということを他の方は指摘されています。

> >当に ReadLine なり Read なりで読み込んでいけばいいんじゃないっすか。
> >ReadToEnd してからこちらで全部解析でもいいですが。
>
> この方法であれば非常に簡単でできるのかな?と考えまして
> ReadLineをつかって読み込んでいく方法の詳細(ここのソースの具体例)
> を知りたいと思い、再度、質問させていただきました。

最初の質問投稿で、
>>string output = p.StandardOutput.ReadToEnd(); // 出力を取得(参照の宣言のみ)

というコードを提示されていますが、ここの部分がReadToEndで読み込むとい部分です。
ReadLineで読み込むとは、一気に全文字列を読み込む代わりに1行単位で読み込むという意味でしかないと思います。

重要なのは読み込んだ1行を、あるいは、読み込んだ全部を”解析”するということだと思います。
で、どう解析するのか?というのは、その解析対象によるわけですが、そのため、
No35527 でSHO.さんが、

> > 今回の質問の例ではIPアドレスを取得する例で質問させていただきましたが、
> > 実はそうではなく
>
> ならば、そちらを説明してもらわなければ、コードは示せません。

とおっしゃっています。
ipconfig.batの例での具体的な解析方法の例は、 No35510 でやじゅさんがコードで提示してくださっています。

ipconfig.batの場合、出力結果の文字列には「IP Address:」という文言が現れるというパターンがあり、
その後の部分がIPアドレスに該当するので、それを正規表現を使って切り出しているわけです。

ipconfig.batではなくあなたが対象とするコンソールアプリの出力結果について
そのパターン等がわからないと、具体的なアドバイスのしようがないという意味です。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -