Process.Iniciar nombre de archivo usando %temp%
-
12-12-2019 - |
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();
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
- Trabajar para cualquier variable de entorno (%APPDATA%, %COMMONPROGRAMFILES%, etc.) y
- 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.