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

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

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

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


(過去ログ 51 を表示中)

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

■28084 / inTopicNo.21)  Re[6]: システム情報 ツールの情報をエクスポートするには?
  
□投稿者/ まぐねしうむ (55回)-(2008/11/19(Wed) 16:11:39)
No28079 (ぽぴ王子 さん) に返信

そのままCopyしましたが
psi.Arguments = "/c \"" + commonProgramFiles + @"\Microsoft Shared\MSInfo\msinfo32.exe\" /report \"" + strPath + "\" /categories +all";
                                                                                                 ~~~~
「文字 '\' は予期されていません。」が表示されます。
もしかして、No28058 でも指摘されていましたが
SP1とSPなしでは動きが違うのでしょうか?
それとも、こちらの実行環境が壊れているのでしょうか?

これをコンパイルが通るように
psi.Arguments = "/c \"" + commonProgramFiles + @"\Microsoft Shared\MSInfo\msinfo32.exe" + '"' + " /report " + '"' + strPath + "\" /categories +all";
に書き換えましたが、依然ファイルが作成されません。

psi.Argumentsの中身は
"/c \"C:\\Program Files\\Common Files\\Microsoft Shared\\MSInfo\\msinfo32.exe\" /report \"C:\\msinfo.log\" /categories +all"
になります。
これをコマンドプロンプト上に貼り付けて実行した所
ファイルが作成されますので、コマンドライン自体は問題ないと思います。

あと、細かい事ですが
string result = File.ReadAllText(strPath);

//出力された結果を表示
Console.WriteLine(results);
                  ~~~~~~~
                  result ですよね

すみません、何がいけないのでしょうか?

引用返信 編集キー/
■28085 / inTopicNo.22)  Re[7]: システム情報 ツールの情報をエクスポートするには?
□投稿者/ 魔界の仮面弁士 (895回)-(2008/11/19(Wed) 16:24:52)
No28084 (まぐねしうむ さん) に返信
> すみません、何がいけないのでしょうか?

問題点を切り分けていきましょう。

まず、バッチファイルからの起動はできますか?
C:\sample.cmd (あるいは、.bat) ファイルに「cmd.exe /c "〜〜 /report 〜〜 +all"」の一文を
記述し、そのファイルを実行できるかどうかを確認してみてください。

それでログが出力されるのであれば、次に、そのバッチファイルを
Process クラス経由で実行できるかどうかを確認してみてください。

それもうまくいくようなら、バッチファイルの記述と、psi 変数に指定した内容とで、
何か相違点が無いかどうかを確認してみてください。
引用返信 編集キー/
■28086 / inTopicNo.23)  Re[3]: システム情報 ツールの情報をエクスポートするには?
□投稿者/ ぽぴ王子 (412回)-(2008/11/19(Wed) 16:26:28)
ぽぴ王子 さんの Web サイト
No28084 (まぐねしうむ さん) に返信

> そのままCopyしましたが
> psi.Arguments = "/c \"" + commonProgramFiles + @"\Microsoft Shared\MSInfo\msinfo32.exe\" /report \"" + strPath + "\" /categories +all";
>                                                                                                  ~~~~
> 「文字 '\' は予期されていません。」が表示されます。

えっと、自分で書いておきながらアレですが、提示したコードはテストしていません。
なので動かない部分もあるかと思います。申し訳ないです。

> もしかして、No28058 でも指摘されていましたが
> SP1とSPなしでは動きが違うのでしょうか?
> それとも、こちらの実行環境が壊れているのでしょうか?

No28058 での指摘ですが、これも別のプロジェクトで記述してみたところ、 '"' で大丈夫なようでした。
申し訳ないです。

もう一度調べてみましたが、/report の引数の部分はダブルクォートで囲んでしまうと終了コードが 1 で返る、つまり
エラーと見なされているようです。
むむむ、これも私が混乱させてしまったようです。申し訳ないです。

> あと、細かい事ですが
> string result = File.ReadAllText(strPath);
> 
> //出力された結果を表示
> Console.WriteLine(results);
>                   ~~~~~~~
>                   result ですよね

そうです。テストしていないので間違えています。申し訳ないです。

引用返信 編集キー/
■28087 / inTopicNo.24)  Re[4]: システム情報 ツールの情報をエクスポートするには?
□投稿者/ まぐねしうむ (56回)-(2008/11/19(Wed) 16:50:16)
2008/11/19(Wed) 16:51:27 編集(投稿者)
No28085 (魔界の仮面弁士 さん) に返信

確認してみました。

・C:\test.batを作成
中に
cmd.exe /c "C:\Program Files\Common Files\Microsoft Shared\MSInfo\msinfo32.exe" /report "C:\msinfo.log" /categories +all
と記載したところ

「'C:\Program' は、内部コマンドまたは外部コマンド、
 操作可能なプログラムまたはバッチファイルとして認識されていません。」

のエラーが表示されます。
また、/cを外して確認したコマンドラインで確認した所
cmd.exe "C:\Program Files\Common Files\Microsoft Shared\MSInfo\msinfo32.exe" /report "C:\msinfo.log" /categories +all

何故か
「'eport'は内部コマンドまたは外部コマンド、
 操作可能なプログラムまたはバッチファイルとして認識されていません。」
となります。

後1点訂正させてください。
>psi.Argumentsの中身は
>"/c \"C:\\Program Files\\Common Files\\Microsoft Shared\\MSInfo\\msinfo32.exe\" /report \"C:\\msinfo.log\" /categories +all"
>になります。
>これをコマンドプロンプト上に貼り付けて実行した所
>ファイルが作成されますので、コマンドライン自体は問題ないと思います。
ですが、コマンドプロンプトに貼り付けたコマンドラインは
"C:\Program Files\Common Files\Microsoft Shared\MSInfo\msinfo32.exe" /report "C:\msinfo.log" /categories +all
になります。
先頭に/c をつけていませんでした。

引用返信 編集キー/
■28088 / inTopicNo.25)  Re[5]: システム情報 ツールの情報をエクスポートするには?
□投稿者/ .SHO (107回)-(2008/11/19(Wed) 17:01:42)
No28087 (まぐねしうむ さん) に返信
> ■No28085 (魔界の仮面弁士 さん) に返信
> 確認してみました。

魔界の仮面弁士さんの解答は正論ですが、とりあえずまず
ぽぴ王子さんの

>/report の引数の部分はダブルクォートで囲んでしまうと終了コードが 1 で返る

を確認してみた方が良くないですか?
引用返信 編集キー/
■28090 / inTopicNo.26)  Re[6]: システム情報 ツールの情報をエクスポートするには?
□投稿者/ まぐねしうむ (57回)-(2008/11/19(Wed) 17:38:22)
No28088 (.SHO さん) に返信

> >/report の引数の部分はダブルクォートで囲んでしまうと終了コードが 1 で返る
> を確認してみた方が良くないですか?
上記箇所を修正した所、動作しました。
psi.Arguments = "/c \"" + commonProgramFiles + @"\Microsoft Shared\MSInfo\msinfo32.exe" + '"' + " /report " + strPath + " /categories +all";

コマンドラインは
/c "C:\Program Files\Common Files\Microsoft Shared\MSInfo\msinfo32.exe" /report C:\msinfo.log /categories +all
になります。

ただし、C:\Documents and Settingsのように中にスペースが入っている
フォルダ名を指定すると、
 「アクセスが拒否されました。」
と言うダイアログが表示されます。

ただ、今回のケースではあくまでもシステム情報を出力できるかを
確認したかったので問題なしとし、解決にしたいと思います。

皆様お手数おかけしましたが
本当にありがとうございました。


解決済み
引用返信 編集キー/
■28095 / inTopicNo.27)  Re[4]: システム情報 ツールの情報をエクスポートするには?
□投稿者/ Jitta on the way (227回)-(2008/11/19(Wed) 18:30:55)
2008/11/19(Wed) 18:32:25 編集(投稿者)

No28086 (ぽぴ王子 さん) に返信

> もう一度調べてみましたが、/report の引数の部分はダブルクォートで囲んでしまうと終了コードが 1 で返る、つまり
> エラーと見なされているようです。
> むむむ、これも私が混乱させてしまったようです。申し訳ないです。

/report を囲んじゃいけないが、その次は囲まなきゃいけない。


で、なぜ + 演算子を使う? string.Format 使えば、ダブル クォーテーションで醜いのが回避出来るじゃないか。

それと、"文字列" と、'文字' に注意。


追加

cmd.exe を通す必要はないよね?
解決済み
引用返信 編集キー/
■28096 / inTopicNo.28)  Re[5]: システム情報 ツールの情報をエクスポートするには?
□投稿者/ 魔界の仮面弁士 (896回)-(2008/11/19(Wed) 18:33:08)
/report パラメータのパスも、「"」で囲まないと駄目なハズ。

■No28087 (まぐねしうむ さん) に返信
> ・C:\test.batを作成
> 中に
> cmd.exe /c "C:\Program Files\Common Files\Microsoft Shared\MSInfo\msinfo32.exe" /report "C:\msinfo.log" /categories +all
> と記載したところ


そうではなく、/C パラメータそのものを囲って

cmd.exe /c ""C:\Program Files\Common Files\Microsoft Shared\MSInfo\msinfo32.exe" /report "C:\msinfo.log" /categories +all"

と書くか、もしくは空白をエスケープ文字(^)で処理して

cmd.exe /c "C:\Program^ Files\Common^ Files\Microsoft^ Shared\MSInfo\msinfo32.exe /report C:\msinfo.log /categories +all"

と書く必要があるかと。


C# で書くと、こんな感じ。

using System;
using System.Diagnostics;

class Class1
{
    static void Main()
    {
        // 空白を含むパス
        string strPath = @"C:\a b c.log";

        ProcessStartInfo psi = new ProcessStartInfo();
        psi.FileName = psi.EnvironmentVariables["ComSpec"];
        psi.RedirectStandardInput = false;
        psi.RedirectStandardOutput = true;
        psi.UseShellExecute = false;
        psi.CreateNoWindow = true;
        string commonProgramFiles = psi.EnvironmentVariables["CommonProgramFiles"];
        psi.Arguments = String.Format(@"/C """"{0}"" /report ""{1}"" /categories +all""",
            commonProgramFiles + @"\Microsoft Shared\MSInfo\msinfo32.exe",
            strPath);
        Process p = Process.Start(psi);
        string results = p.StandardOutput.ReadToEnd();
        p.WaitForExit();
        Console.WriteLine(results);
        Console.ReadKey();
    }
}


>>psi.Argumentsの中身は
>>"/c \"C:\\Program Files\\Common Files\\Microsoft Shared\\MSInfo\\msinfo32.exe\" /report \"C:\\msinfo.log\" /categories +all"
>>になります。
これは、ツールチップ中の虫眼鏡アイコンからの [テキスト ビジュアライザ]ウィンドウで表示すると、
『/c "C:\Program Files\Common Files\Microsoft Shared\MSInfo\msinfo32.exe" /report "C:\msinfo.log" /categories +all』
として表示されるということですね。

解決済み
引用返信 編集キー/
■28097 / inTopicNo.29)  Re[5]: システム情報 ツールの情報をエクスポートするには?
□投稿者/ 魔界の仮面弁士 (897回)-(2008/11/19(Wed) 18:42:32)
No28095 (Jitta on the way さん) に返信
> 追加
> cmd.exe を通す必要はないよね?

おおう。元のコードを引きずってしまっていました。迂闊。
cmd.exe 不要となれば、こうなるかな。


ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = Path.Combine(
 psi.EnvironmentVariables["CommonProgramFiles"],
 @"Microsoft Shared\MSInfo\msinfo32.exe");
psi.Arguments = String.Format(@"/report ""{0}"" /categories +all", strPath);
解決済み
引用返信 編集キー/

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

このトピックに書きこむ

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

管理者用

- Child Tree -