3

いくつかの奇妙な理由で、このコードは失敗します:

p.StartInfo.FileName = @"%temp%\SSCERuntime_x86-ENU.msi";

そして、このコードは成功します:

p.StartInfo.FileName = @"C:\Users\USERNAME\AppData\Local\Temp\SSCERuntime_x86-ENU.msi";

私が行方不明になっている理由はありますか?

パスをコピーしただけであることに注意してください。残りのコードは必要ないと思いますが、とにかく入れます。

Process p = new Process();
p.StartInfo.FileName = @"%temp%\SSCERuntime_x86-ENU.msi";
p.StartInfo.Arguments = "/passive";
p.Start();
4

5 に答える 5

4

このProcessクラスは、環境変数 (つまり ) で文字列を展開しません%temp%

FileName環境変数を使用してプロパティを構築する場合は、( classのGetEnvironmentVariableメソッドを使用して) 環境変数を取得し、次のように自分で置換を実行する必要があります。Environment

// Construct the path.
string temp = Environment.GetEnvironmentVariable("temp");
string path = Path.Combine(temp, "SSCERuntime_x86-ENU.msi");

// Launch the process.
Process p = new Process();
p.StartInfo.FileName = path;
p.StartInfo.Arguments = "/passive";
p.Start();

さらに、次のように元の文字列でExpandEnvironmentVariablesメソッドを使用できます。

p.StartInfo.FileName = 
    Environment.ExpandEnvironmentVariables(@"%temp%\SSCERuntime_x86-ENU.msi");
于 2012-03-12T22:04:39.027 に答える
1

文字列の%temp%一部は、適切な環境変数に置き換えられるのではなく、文字どおりに解釈されています。手動で展開する必要があります

var temp = Environment.GetEnvironmentVariable("temp");
var fileName = Path.Combine(temp, "SSCERuntime_x86-ENU.msi");
p.StartInfo.FileName = fileName;
于 2012-03-12T22:05:19.910 に答える
0

%TEMP% は、コマンド シェルによって解析および評価されます。この目的でPath.GetTempPath()Path.Combineを使用できます。

p.StartInfo.FileName = Path.Combine(Path.GetTempPath(), @"SSCERuntime_x86-ENU.msi");
于 2012-03-12T22:03:44.370 に答える
0

これを試して:

string tempPath = Environment.GetEnvironmentVariable("Temp");

次に、次のように連結します。

p.StartInfo.FileName = Path.Combine(tempPath, "SSCERuntime_x86-ENU.msi"); 

キャスパーは説明のパンチに私を打ち負かしましたが、Process.Start メソッドは基本的に、シェルのように解釈するのではなく、文字どおりに扱います。

于 2012-03-12T22:03:55.640 に答える
0

を使用しEnvironment.ExpandEnvironmentVariablesて文字列内の環境変数を展開し、それをProcessクラスに渡すことができます。

p.StartInfo.FileName = Environment.ExpandEnvironmentVariables(@"%temp%\SSCERuntime_x86-ENU.msi");

これには、次の追加の利点があります。

  1. 任意の環境変数 (%APPDATA%、%COMMONPROGRAMFILES% など) での作業、および
  2. 文字列内のどこでも動作します (例: "%temp%\%username%\foo.txt")
于 2012-03-12T22:06:54.160 に答える