質問

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

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();
役に立ちましたか?

解決

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

環境変数を使用して FileNameプロパティ次に、環境変数を取得する必要があります( 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");
.

他のヒント

文字列の%temp%部分は、適切な環境変数に置き換えられるのではなく、文字通り解釈されています。手動でそれを拡張する必要があります

var temp = Environment.GetEnvironmentVariable("temp");
var fileName = Path.Combine(temp, "SSCERuntime_x86-ENU.msi");
p.StartInfo.FileName = fileName;
.

%temp%は、コマンドシェルによって解析され、評価されます。使用できる path.gettemppath() path.combine この目的のために。

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

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

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

これに加えられた利点がのあります

  1. 任意の環境変数(%APPDATA%、%COMMONPROGRAMFILES%など)に対して動作します。
  2. 文字列内の任意の場所で作業する(例:"%temp%\%username%\foo.txt")

これを試してみてください:

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

それを連れて:

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

キャスパーは私を説明のパンチに打ちましたが、Process.Startメソッドは基本的にそれをシェルとして区画するのではなくそれを文字通り扱います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top