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

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

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

Re[5]: setコマンドの実行


(過去ログ 95 を表示中)

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

■56700 / inTopicNo.1)  setコマンドの実行
  
□投稿者/ ペンギン (12回)-(2011/01/26(Wed) 21:24:45)

分類:[.NET 全般] 

setコマンドの実施

こんにちは

現在C#からコマンドプロンプトを実行し、setコマンドを実行する処理を実装しております。
以下のようなコードで実装してみましたが、C#からsetコマンドを実行できません。
どの部分が悪いのか教えて頂けないでしょうか。
------------------------------------------------------------------------------------
System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo();
psi.FileName = System.Environment.GetEnvironmentVariable("ComSpec");
psi.RedirectStandardInput = false;
psi.RedirectStandardOutput = true;
psi.UseShellExecute = false;
psi.CreateNoWindow = true;
psi.Arguments = @"/c set c:\";//ここでコマンドを設定
System.Diagnostics.Process p = System.Diagnostics.Process.Start(psi);//実行
string results = p.StandardOutput.ReadToEnd();
p.WaitForExit();
Console.WriteLine("results=" + results);//結果をコンソールに出力
regkey.Close();
------------------------------------------------------------------------------------

宜しくお願いします。

引用返信 編集キー/
■56701 / inTopicNo.2)  Re[1]: setコマンドの実行
□投稿者/ Hongliang (748回)-(2011/01/26(Wed) 22:01:25)
set ですか? 単独で呼び出す意味があまりないような気もしますが……。
環境変数の取得・設定なら Environment クラスに GetEnvironmentVariable・GetEnvironmentVariables メソッドがありますけど。
子プロセスに設定したい場合は ProcessStartInfo に設定する物ですし。

とりあえず、普通 C:\ なんて名前の環境変数は定義しないでしょうから、エラーが出力されてるのではないでしょうか。
その場合、StandardError をリダイレクトして読み取る必要があります。
その際はデッドロックに注意してください(詳しくは MSDN の Process.StandardOutput の解説参照)。
引用返信 編集キー/
■56704 / inTopicNo.3)  Re[2]: setコマンドの実行
□投稿者/ Azulean (681回)-(2011/01/26(Wed) 23:06:52)
ところで、なぜ set を実行したいのでしょうか?

留意点
・単純に set だけ実行しても、システムのプロパティにある環境変数が変わるわけではありません。
・自分のプロセスにおける環境変数、子プロセスにおける環境変数の変更については Hongliang さんがアドバイスされています。
 http://msdn.microsoft.com/ja-jp/library/system.environment.setenvironmentvariable.aspx
 http://msdn.microsoft.com/ja-jp/library/system.diagnostics.processstartinfo.environmentvariables.aspx
引用返信 編集キー/
■56716 / inTopicNo.4)  Re[3]: setコマンドの実行
□投稿者/ ペンギン (13回)-(2011/01/27(Thu) 15:20:19)
返信ありがとうございます。


>ところで、なぜ set を実行したいのでしょうか?
実は今回はC#で作成されたアプリケーションからコマンドを実行して、PCに任意のoracle製品がインストールされているかどうをチェックする
モジュールを作成しようとしています。
そこで、コマンドラインを立ち上げてコマンドを実行する箇所がうまくいかないので質問させてください。

[実行コマンド]
 (1)ORACLE_HOMEの設定(このコマンドを実行しないと2つ目のコマンドが成功しません)
   C:\app\Administrator\product\11.2.0\client_1\OPatch>set ORACLE_HOME=C:\app\Administrator\product\11.2.0\client_1

 (2)opatchの実行(oracle製品一覧を表示する処理です)
   C:\app\Administrator\product\11.2.0\client_1\OPatch>opatch lsinventory -detail
  
 2つ目のコマンドを実行すると、PCにインストールされている全てのoracle製品がコマンドライン上に表示されます。
 ※今回はORACLE_HOMEにC:\app\Administrator\product\11.2.0\client_1を設定しています。
 
[C#ソース]
 System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo();
 psi.FileName = System.Environment.GetEnvironmentVariable("ComSpec");
 psi.RedirectStandardInput = false;
 psi.RedirectStandardOutput = true;
 psi.UseShellExecute = false;
 psi.CreateNoWindow = true;
 psi.WorkingDirectory = @"c:\app\Administrator\product\11.2.0\client_1\OPatch";//実行ディレクトリの設定
 string[] strCmds = { @"/c set ORACLE_HOME=c:\app\Administrator\product\11.2.0\client_1", @"/c opatch lsinventory -detail" };
 for (int i=0;i<strCmds.Length;i++)
 {
  psi.Arguments = strCmds[i];
  System.Diagnostics.Process p = System.Diagnostics.Process.Start(psi);
  results = p.StandardOutput.ReadToEnd();
  p.WaitForExit();
  Console.WriteLine("results=" + results);
 }

[C#実行結果]
 results=
 results=Oracle Home is not set. OPatch cannot proceed!
 
 OPatch failed with error code = 1

[問題]
 1つ目のコマンドでORACLE_HOMEを設定しているにも関わらず、2つ目のコマンドでoracle製品の一覧が表示されません。
 1つ目のコマンドで設定した情報が引き継がれていないためでしょうか。
 
[質問]
 コマンドライン上でコマンドを連続して実行したい際に、上記[C#のソース]のような処理で可能でしょうか。
 また、何か良い方法があったら教えて頂けないでしょうか。
 
 今回は情報が不十分で申し訳ございませんでした。setコマンドは単体で実行した際、うまくいくことを確認しました。
 
 宜しくお願いします。
引用返信 編集キー/
■56717 / inTopicNo.5)  Re[4]: setコマンドの実行
□投稿者/ shu (385回)-(2011/01/27(Thu) 15:30:34)
No56716 (ペンギン さん) に返信

1プロセスで実行しないと環境変数は消えてしまいます。
batファイルを作成して、1回の実行で済むようにしてみてはどうでしょう?

引用返信 編集キー/
■56718 / inTopicNo.6)  Re[4]: setコマンドの実行
□投稿者/ 魔界の仮面弁士 (2035回)-(2011/01/27(Thu) 15:50:12)
No56716 (ペンギン さん) に返信
> PCに任意のoracle製品がインストールされているかどうをチェックする
> モジュールを作成しようとしています。

バージョンにもよりますが、Windows 版の ORACLE_HOME の場合、
通常は HKLM の SOFTWARE\ORACLE から読み取るのではありませんでしたっけ?

# 環境変数も使えますが、通常はレジストリの利用が推奨されいてような気が(うろ覚え)
引用返信 編集キー/
■56721 / inTopicNo.7)  Re[5]: setコマンドの実行
□投稿者/ Hongliang (751回)-(2011/01/27(Thu) 15:54:27)
私の前の投稿で、子プロセスについて言及しましたよね?
opatch なるものを Process.Start するときに、その ProcessStartInfo の EnvironmentVariables に追加することで Start するプロセスに環境変数を追加できます。
引用返信 編集キー/
■56725 / inTopicNo.8)  Re[5]: setコマンドの実行
□投稿者/ ペンギン (15回)-(2011/01/28(Fri) 00:06:51)
Hongliangさんありがとうございます。
ProcessStartInfoのEnvironmentVariablesに環境変数を設定することで解決しました。

コマンドで設定することしか考えていなかったのではまっていました。

どうもありがとうございました。

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


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

このトピックに書きこむ

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

管理者用

- Child Tree -