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

È stato utile?

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

    .
  1. Lavorare per qualsiasi variabile di ambiente (% appdata%,% commonprogramFiles%, ecc.) e
  2. 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top