Process.Start Nome file usando% temp%
-
12-12-2019 - |
Domanda
Per alcuni rapporti dispari Questo codice fallisce:
p.StartInfo.FileName = @"%temp%\SSCERuntime_x86-ENU.msi";
.
E questo codice è:
p.StartInfo.FileName = @"C:\Users\USERNAME\AppData\Local\Temp\SSCERuntime_x86-ENU.msi";
.
C'è qualche ragione per cui mi manca?
Nota Ho appena copiato il percorso, non penso che il resto del codice sia necessario, ma lo metterò comunque:
Process p = new Process();
p.StartInfo.FileName = @"%temp%\SSCERuntime_x86-ENU.msi";
p.StartInfo.Arguments = "/passive";
p.Start();
. Soluzione
the Process
Class non espandono le stringhe con Variabili di ambiente (cioè %temp%
).
Se si desidera utilizzare le variabili di ambiente per costruire il FileName
Property Allora dovrai ottenere le variabili di ambiente (usando la Metodo GetEnvironmentVariable
su GeneracodictagCode Class ) ed esegui La sostituzione da solo, come:
// 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();
.
Inoltre, è possibile utilizzare Metodo Environment
Con la tua stringa originale come:
p.StartInfo.FileName =
Environment.ExpandEnvironmentVariables(@"%temp%\SSCERuntime_x86-ENU.msi");
. Altri suggerimenti
La porzione %temp%
della stringa viene interpretata letteralmente anziché essere sostituita con la variabile di ambiente appropriata.Avrai bisogno di espandere manualmente
var temp = Environment.GetEnvironmentVariable("temp");
var fileName = Path.Combine(temp, "SSCERuntime_x86-ENU.msi");
p.StartInfo.FileName = fileName;
. % temp% è analizzato e valutato da comando shell.È possibile utilizzare l'uso percorso.getTemppath () e path.combine per questo scopo.
p.StartInfo.FileName = Path.Combine(Path.GetTempPath(), @"SSCERuntime_x86-ENU.msi");
. È possibile utilizzare Environment.ExpandEnvironmentVariables
per espandere le variabili di ambiente all'interno di una stringa, quindi passarlo alla classe Process
:
p.StartInfo.FileName = Environment.ExpandEnvironmentVariables(@"%temp%\SSCERuntime_x86-ENU.msi");
.
Questo ha i vantaggi aggiuntivi di
- .
- Lavorare per qualsiasi variabile di ambiente (% appdata%,% commonprogramFiles%, ecc.) e
- Lavorando ovunque nella stringa (ad esempio "% temp% \% Nome utente% \ foo.txt")
Prova questo:
string tempPath = Environment.GetEnvironmentVariable("Temp");
.
Quindi concat in:
p.StartInfo.FileName = Path.Combine(tempPath, "SSCERuntime_x86-ENU.msi");
.
Casper mi ha battuto al punch sulla spiegazione, ma il metodo Process.Start tratta fondamentalmente la tratta letteralmente invece di intrappolarlo come lo farebbe la shell.