Pregunta

Por alguna extraña razón este código falla:

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

y este código tiene éxito:

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

¿Hay alguna razón por la que estoy desaparecido?

Nota Acabo de copiar la ruta, no creo que el resto del código sea necesario pero lo pondré de todos modos:

Process p = new Process();
p.StartInfo.FileName = @"%temp%\SSCERuntime_x86-ENU.msi";
p.StartInfo.Arguments = "/passive";
p.Start();
¿Fue útil?

Solución

El Process clase no expande cadenas con variables de entorno (es decir, %temp%).

Si desea utilizar variables de entorno para construir el FileName propiedad entonces tendrás que obtener las variables de entorno (usando el GetEnvironmentVariable método sobre el Environment clase) y realice la sustitución usted mismo, así:

// 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();

Además, puede utilizar el ExpandEnvironmentVariables método con tu cadena original así:

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

Otros consejos

La parte %temp% de la cadena se está interpretando literalmente en lugar de reemplazarse con la variable de entorno apropiada.Tendrá que expandirlo manualmente

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

% TEMP% está analizado y evaluado por Command Shell.Usted podría usar su uso path.gettempppath () y rayy.combine para este propósito.

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

Puedes usar el Environment.ExpandEnvironmentVariables para expandir las variables de entorno dentro de una cadena, luego pasar eso al Process clase:

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

Esto tiene los beneficios adicionales de

  1. Trabajar para cualquier variable de entorno (%APPDATA%, %COMMONPROGRAMFILES%, etc.) y
  2. Trabajando en cualquier parte de la cadena (p. ej."%temp%\%nombredeusuario%\foo.txt")

Intenta esto:

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

entonces concatelo en:

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

Casper me venció con el golpe en la explicación, pero el método de proceso, básicamente, lo trata, literalmente, en lugar de intréralo como lo haría la concha.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top