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

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

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

Re[7]: システム情報 ツールの情報をエクスポートするには?


(過去ログ 51 を表示中)

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

■28058 / inTopicNo.1)  システム情報 ツールの情報をエクスポートするには?
  
□投稿者/ まぐねしうむ (50回)-(2008/11/19(Wed) 13:46:14)

分類:[C#] 

いつもお世話になっております。
早速ですが、C#からmsinfo32.exeをコマンドプロンプトから
呼び出し、引数を使いシステム情報をファイルに出力しようと考えています。

具体的には、コマンドプロンプト上で
"%CommonProgramFiles%\Microsoft Shared\MSInfo.\msinfo32.exe" /report C:\msinfo.log /categories +all
を打つと、自動的にシステム情報を出力してくれますが
これを、C#上でボタンを押すだけで出力しよう考えておりますが
なぜか、出力されません。

考えられる要因がpsi.Argumentsのコマンドの中身位なのですが
MsgBoxで中身を確認しましたが、同じように見えます。

何がまずいんでしょうか?
よろしければどなたかアドバイスください。

◆書いたコード

ProcessStartInfo psi = new ProcessStartInfo();
//ComSpecのパスを取得する
psi.FileName = System.Environment.GetEnvironmentVariable("ComSpec");

//出力を読み取れるようにする
psi.RedirectStandardInput = false;
psi.RedirectStandardOutput = true;
psi.UseShellExecute = false;
//ウィンドウを表示しないようにする
psi.CreateNoWindow = true;
//コマンドラインを指定
psi.Arguments = '"' + @"%CommonProgramFiles%\Microsoft Shared\MSInfo.\msinfo32.exe" + '"' + " /report " + strPath + @" /categories +all";

//起動
System.Diagnostics.Process p = System.Diagnostics.Process.Start(psi);
//出力を読み取る
string results = p.StandardOutput.ReadToEnd();
//WaitForExitはReadToEndの後である必要がある
//(親プロセス、子プロセスでブロック防止のため)
p.WaitForExit();

//出力された結果を表示
Console.WriteLine(results);

引用返信 編集キー/
■28060 / inTopicNo.2)  Re[1]: システム情報 ツールの情報をエクスポートするには?
□投稿者/ ぽぴ王子 (409回)-(2008/11/19(Wed) 14:08:13)
ぽぴ王子 さんの Web サイト
No28058 (まぐねしうむ さん) に返信

> //コマンドラインを指定
> psi.Arguments = '"' + @"%CommonProgramFiles%\Microsoft Shared\MSInfo.\msinfo32.exe" + '"' + " /report " + strPath + @" /categories +all";

これ、このままじゃコンパイルすら通らないような気がしますが、ミニマムコードとして
成立していますか?

あと、 strPath もダブルクォートで囲む必要があるし、コマンドラインの先頭には " /c "
を追加した方がよいと思います。
引用返信 編集キー/
■28062 / inTopicNo.3)  Re[1]: システム情報 ツールの情報をエクスポートするには?
□投稿者/ みきぬ (230回)-(2008/11/19(Wed) 14:16:22)
※回答ではなくて、追加情報です。

> ◆書いたコード
>
このサンプルを参考にしたんですね。
http://dobon.net/vb/dotnet/process/standardoutput.html
引用返信 編集キー/
■28063 / inTopicNo.4)  Re[2]: システム情報 ツールの情報をエクスポートするには?
□投稿者/ まぐねしうむ (51回)-(2008/11/19(Wed) 14:16:31)
ぽぴ王子 さん返信有難うございます

> これ、このままじゃコンパイルすら通らないような気がしますが、ミニマムコードとして
> 成立していますか?
VS2005 Sp1を使っていますがコンパイル自体は通ります。

また、ご指摘の箇所を書き換えてpsi.Argumentsの中を確認したところ
"\"%CommonProgramFiles%\\Microsoft Shared\\MSInfo.\\msinfo32.exe\" /c /report \"C:\\msinfo.log\" /categories +all"
となっております。


引用返信 編集キー/
■28064 / inTopicNo.5)  Re[2]: システム情報 ツールの情報をエクスポートするには?
□投稿者/ .SHO (95回)-(2008/11/19(Wed) 14:18:19)
No28060 (ぽぴ王子 さん) に返信

> あと、 strPath もダブルクォートで囲む必要があるし…

strPath は、別のところでパスの宣言を忘れてるだけでしょう。
ダブルクォートで囲ったら変です。
引用返信 編集キー/
■28065 / inTopicNo.6)  Re[1]: システム情報 ツールの情報をエクスポートするには?
□投稿者/ .SHO (96回)-(2008/11/19(Wed) 14:20:27)
No28058 (まぐねしうむ さん) に返信

これ、そもそも msinfo32 は、処理結果を /report で指定された
ファイルに出力するのであって、標準出力に吐き出すわけではないので
取れるわけないです。

引用返信 編集キー/
■28066 / inTopicNo.7)  Re[2]: システム情報 ツールの情報をエクスポートするには?
□投稿者/ まぐねしうむ (52回)-(2008/11/19(Wed) 14:29:11)
>※回答ではなくて、追加情報です。
ご指摘の通り、参考というか丸パクリさせていただいています。
あくまでも、コマンドプロンプトを通して
情報が出力できるか確認したかったもので・・・

>strPath は、別のところでパスの宣言を忘れてるだけでしょう。
>ダブルクォートで囲ったら変です。
指摘の通りstrPathは出力したいファイルのパス情報を格納しております。
(別のルーチンでSaveFileDialogを呼び出しています。)
説明不足で申し訳ありませんでした。

> これ、そもそも msinfo32 は、処理結果を /report で指定された
> ファイルに出力するのであって、標準出力に吐き出すわけではないので
> 取れるわけないです。

最初の説明にも記載させて頂きましたがシステム情報をファイルに
出力するのが目的です。
標準出力側は、いい言葉が見つからないのですが、コマンドの実行結果?を
表示しようと考えています。

引用返信 編集キー/
■28069 / inTopicNo.8)  Re[3]: システム情報 ツールの情報をエクスポートするには?
□投稿者/ .SHO (98回)-(2008/11/19(Wed) 14:38:57)
No28066 (まぐねしうむ さん) に返信

> 最初の説明にも記載させて頂きましたがシステム情報をファイルに
> 出力するのが目的です。

つまり、平たく言えば実行してもC:\\msinfo.logが空ってことですか?

> 標準出力側は、いい言葉が見つからないのですが、コマンドの実行結果?を
> 表示しようと考えています。

msinfo32は標準出力に何も出さないので何も表示されません。

引用返信 編集キー/
■28071 / inTopicNo.9)  Re[3]: システム情報 ツールの情報をエクスポートするには?
□投稿者/ ぽぴ王子 (410回)-(2008/11/19(Wed) 14:46:17)
ぽぴ王子 さんの Web サイト
No28063 (まぐねしうむ さん) に返信

>>これ、このままじゃコンパイルすら通らないような気がしますが、ミニマムコードとして
>>成立していますか?
> VS2005 Sp1を使っていますがコンパイル自体は通ります。

ふむふむ。VS2008(SPなし) ではコンパイル以前に注意されてしまいました。
> 無効なトークン '=' が クラス、構造体またはインターフェイスのメンバ宣言で使用されています。
だそうです。

//コマンドラインを指定
psi.Arguments = "\"" + @"%CommonProgramFiles%\Microsoft Shared\MSInfo.\msinfo32.exe" + "\"" + " /report " + strPath + @" /categories +all";

じゃないかな?と思ったのです。

> また、ご指摘の箇所を書き換えてpsi.Argumentsの中を確認したところ
> "\"%CommonProgramFiles%\\Microsoft Shared\\MSInfo.\\msinfo32.exe\" /c /report \"C:\\msinfo.log\" /categories +all"
> となっております。

そうなったのはいいのですが、それでどうなったのでしょうか。
できたと書かれていないということは、それでもダメだった、ということですか?


No28064 (.SHO さん) に返信
> ■No28060 (ぽぴ王子 さん) に返信
>
>>あと、 strPath もダブルクォートで囲む必要があるし…
>
> strPath は、別のところでパスの宣言を忘れてるだけでしょう。
> ダブルクォートで囲ったら変です。

ちゃんと書かなかったので意味が伝わらなかったかもしれませんが、 "strPath" と書け、という意味ではないですよ。
strPath にパス名が入ると思うので、Program Files のようにスペースが入ったパスになった場合を考えて、最終的に
ダブルクォートで囲んだ方がいいよね、という話です。

No28066 (まぐねしうむ さん) に返信

> ご指摘の通り、参考というか丸パクリさせていただいています。
> あくまでも、コマンドプロンプトを通して
> 情報が出力できるか確認したかったもので・・・

参考でも丸パクリでもいいですが、それならそうと書いてください。
スレ主さんの書いたコードが悪いのか、それとも参考元が悪いのかの判断がつきませんし、参考元がマズい場合はフィードバック
する必要もあるでしょう。どぼん!さんのコードを丸パクリして「俺が<del>育てた</del>書いた」と言いはるのはいかがなものか
とは思いますが。

>>これ、そもそも msinfo32 は、処理結果を /report で指定された
>>ファイルに出力するのであって、標準出力に吐き出すわけではないので
>>取れるわけないです。
>
> 最初の説明にも記載させて頂きましたがシステム情報をファイルに
> 出力するのが目的です。
> 標準出力側は、いい言葉が見つからないのですが、コマンドの実行結果?を
> 表示しようと考えています。

えーと、どぼん!さんのコードが何をしているのか理解されていますか?
標準出力に出力された内容を取り出して表示していますよね。
で、.SHO さんの指摘は「そもそも標準出力に出てないんだから、それを取り出しても意味ないんじゃね?」という話です。
# と思ったら書かれていた
引用返信 編集キー/
■28072 / inTopicNo.10)  Re[4]: システム情報 ツールの情報をエクスポートするには?
□投稿者/ まぐねしうむ (53回)-(2008/11/19(Wed) 14:47:38)
>>最初の説明にも記載させて頂きましたがシステム情報をファイルに
>>出力するのが目的です。
>
> つまり、平たく言えば実行してもC:\\msinfo.logが空ってことですか?
C:\\msinfo.logのファイルが出来ていません。
なので、コマンドラインが変だと思うのですが・・・・。

>>標準出力側は、いい言葉が見つからないのですが、コマンドの実行結果?を
>>表示しようと考えています。
>
> msinfo32は標準出力に何も出さないので何も表示されません。
すみません、コレは勘違いしていました。
確認していなかったのですが、msinfo32に対して間違ったパラメータ等を
渡した際に、エラーが帰ってくると思っていました。

申し訳ありません。
引用返信 編集キー/
■28073 / inTopicNo.11)  Re[4]: システム情報 ツールの情報をエクスポートするには?
□投稿者/ まぐねしうむ (54回)-(2008/11/19(Wed) 14:58:28)
No28071 (ぽぴ王子 さん) に返信
> そうなったのはいいのですが、それでどうなったのでしょうか。
> できたと書かれていないということは、それでもダメだった、ということですか?
依然状況変わらず、msinfo.logが作成されません。

> 参考でも丸パクリでもいいですが、それならそうと書いてください。
おっしゃる通りです。

>丸パクリして「俺が<del>育てた</del>書いた」と言いはるのはいかがなものか
> とは思いますが。
誤解を招く表現で申し訳ありませんでした。
自分では「◆書いたコード」=「実行しているコード」程度の認識でした。
今後気をつけたいと思います。


引用返信 編集キー/
■28074 / inTopicNo.12)  Re[4]: システム情報 ツールの情報をエクスポートするには?
□投稿者/ .SHO (100回)-(2008/11/19(Wed) 14:58:45)
No28071 (ぽぴ王子 さん) に返信

> Program Files のようにスペースが入ったパスになった場合を考えて、最終的に
> ダブルクォートで囲んだ方がいいよね、という話です。

あーなるほど!意外と奥が深かったですね^^;
失礼しましたm(_"_)m
引用返信 編集キー/
■28075 / inTopicNo.13)  Re[5]: システム情報 ツールの情報をエクスポートするには?
□投稿者/ .SHO (101回)-(2008/11/19(Wed) 15:04:00)
No28072 (まぐねしうむ さん) に返信

> 確認していなかったのですが、msinfo32に対して間違ったパラメータ等を
> 渡した際に、エラーが帰ってくると思っていました。

なるほど。

もともとmsinfo32はWindowsプログラムで/reportオプションでWindowを
作らないのは、おまけみたいなもの(言い過ぎかな?)なので
パラメータのエラーは無視しちゃうだけですね。

まぁいずれにしても、もしエラーを出力したとしても、msinfo32が
まともに設計されていれば、エラーは標準エラー出力に出しているはずです。
引用返信 編集キー/
■28076 / inTopicNo.14)  Re[3]: システム情報 ツールの情報をエクスポートするには?
□投稿者/ .SHO (102回)-(2008/11/19(Wed) 15:10:50)
No28063 (まぐねしうむ さん) に返信
> また、ご指摘の箇所を書き換えてpsi.Argumentsの中を確認したところ
> "\"%CommonProgramFiles%\\Microsoft Shared\\MSInfo.\\msinfo32.exe\" /c /report \"C:\\msinfo.log\" /categories +all"
> となっております。

で本題ですが…^^;

Console.WriteLine(psi.Arguments);
で上記のようになったわけですよね。

一番最初の「"」とかいらないし、「"」をエスケープする「\」もいらなくないですか?
引用返信 編集キー/
■28077 / inTopicNo.15)  Re[6]: システム情報 ツールの情報をエクスポートするには?
□投稿者/ みきぬ (231回)-(2008/11/19(Wed) 15:32:16)
No28075 (.SHO さん) に返信
> まぁいずれにしても、もしエラーを出力したとしても、msinfo32が
> まともに設計されていれば、エラーは標準エラー出力に出しているはずです。
>
ここがよくわからなかった。エラーダイアログじゃないの?
標準エラー出力に出したとして、誰が見るの?


(おまけ)
ふと思い立って、msinfo32 /report con とやってみたりした。
これで標準出力に出るかなとわくわくしてたら、「アクセスが拒否されました」のエラーダイアログが出てきた。はうぅ。
引用返信 編集キー/
■28078 / inTopicNo.16)  Re[3]: システム情報 ツールの情報をエクスポートするには?
□投稿者/ .SHO (103回)-(2008/11/19(Wed) 15:33:16)
No28063 (まぐねしうむ さん) に返信

> また、ご指摘の箇所を書き換えてpsi.Argumentsの中を確認したところ
> "\"%CommonProgramFiles%\\Microsoft Shared\\MSInfo.\\msinfo32.exe\" /c /report \"C:\\msinfo.log\" /categories +all"
> となっております。

それから、/c の位置が間違ってます。
これだと動きません。
/c は一番最初です。

引用返信 編集キー/
■28079 / inTopicNo.17)  Re[5]: システム情報 ツールの情報をエクスポートするには?
□投稿者/ ぽぴ王子 (411回)-(2008/11/19(Wed) 15:33:49)
ぽぴ王子 さんの Web サイト
No28076 (.SHO さん) に返信
> ■No28063 (まぐねしうむ さん) に返信
>>また、ご指摘の箇所を書き換えてpsi.Argumentsの中を確認したところ
>>"\"%CommonProgramFiles%\\Microsoft Shared\\MSInfo.\\msinfo32.exe\" /c /report \"C:\\msinfo.log\" /categories +all"
>>となっております。
> 
> で本題ですが…^^;
> 
> Console.WriteLine(psi.Arguments);
> で上記のようになったわけですよね。
> 
> 一番最初の「"」とかいらないし、「"」をエスケープする「\」もいらなくないですか?

一番最初の「"」と、エスケープするための「\」は勝手に出力されるものです。
IDE を使用されていないとのことなので、ご存知ではないかと思いますが。

なんだか(私を含め)スレ主さんを混乱させてしまう投稿があったようなので、もう一度まとめてみます。

・msinfo32.exe は /report ファイル名 で指定したファイルにレポートを出力するので、標準出力には
 何も出力されない。
 その代わり、exit code として 1 または 0 を返す。

・コマンドプロンプト cmd.exe へのパラメータでファイルを実行させるには /c スイッチが先頭に必要。

・%CommonProgramFiles% は自動的には展開されない。

・MSInfo. ではなく MSInfo である。

以上をふまえると、コマンドラインはこんな感じになります。

    ProcessStartInfo psi = new ProcessStartInfo();
    // ComSpecのパスを取得する
    psi.FileName = System.Environment.GetEnvironmentVariable("ComSpec");

    // 出力を読み取れるようにする
    psi.RedirectStandardInput = false;
    psi.RedirectStandardOutput = true;
    psi.UseShellExecute = false;
    // ウィンドウを表示しないようにする
    psi.CreateNoWindow = true;
    // CommonProgramFilesフォルダを取得
    string commonProgramFiles = System.Environment.GetEnvironmentVariable("CommonProgramFiles");
    // コマンドラインを指定
    psi.Arguments = "/c \"" + commonProgramFiles + @"\Microsoft Shared\MSInfo\msinfo32.exe\" /report \"" + strPath + "\" /categories +all";
    /* strPath は ダブルクォーテーションを含まない形にする */

    // 起動
    System.Diagnostics.Process p = System.Diagnostics.Process.Start(psi);
    p.WaitForExit();

    if (p.ExitCode == 0)
    {
        string result = File.ReadAllText(strPath);

        //出力された結果を表示
        Console.WriteLine(results);
    }

もう少しつっこむところはあるかとは思いますが、とりあえずこんな感じです。

引用返信 編集キー/
■28080 / inTopicNo.18)  Re[7]: システム情報 ツールの情報をエクスポートするには?
□投稿者/ .SHO (104回)-(2008/11/19(Wed) 15:36:37)
No28077 (みきぬ さん) に返信

>>まぁいずれにしても、もしエラーを出力したとしても、msinfo32が
>>まともに設計されていれば、エラーは標準エラー出力に出しているはずです。
>>
> ここがよくわからなかった。エラーダイアログじゃないの?
> 標準エラー出力に出したとして、誰が見るの?

エラーダイアログです。
あくまで、(まぐねしうむさんの期待するような形で)もし出したとしても、です。
引用返信 編集キー/
■28082 / inTopicNo.19)  Re[6]: システム情報 ツールの情報をエクスポートするには?
□投稿者/ .SHO (105回)-(2008/11/19(Wed) 15:44:26)
No28079 (ぽぴ王子 さん) に返信

> 一番最初の「"」と、エスケープするための「\」は勝手に出力されるものです。
> IDE を使用されていないとのことなので、ご存知ではないかと思いますが。

ひぃ〜、そうなんですか。びっくりです。
勉強になりました。以後、気をつけます。

> ・%CommonProgramFiles% は自動的には展開されない。

やっぱりそうですか。
そこも気になってはいたんですが、面倒なので検証はしませんでした。

> もう少しつっこむところはあるかとは思いますが、とりあえずこんな感じです。

まとまりましたね。ありがとうございます。

引用返信 編集キー/
■28083 / inTopicNo.20)  Re[7]: システム情報 ツールの情報をエクスポートするには?
 
□投稿者/ .SHO (106回)-(2008/11/19(Wed) 15:51:46)
No28077 (みきぬ さん) に返信

> ふと思い立って、msinfo32 /report con とやってみたりした。
> これで標準出力に出るかなとわくわくしてたら、「アクセスが拒否されました」のエラーダイアログが出てきた。はうぅ。

思わず自分もやってみてしまった(笑)
なんでアクセスが拒否されるんだ?
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -