Question

Pour une raison étrange, ce code échoue :

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

et ce code réussit :

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

Y a-t-il une raison pour laquelle je manque ?

Note Je viens de copier le chemin, je ne pense pas que le reste du code soit nécessaire mais je le mets quand même :

Process p = new Process();
p.StartInfo.FileName = @"%temp%\SSCERuntime_x86-ENU.msi";
p.StartInfo.Arguments = "/passive";
p.Start();
Était-ce utile?

La solution

Le Process classe ne développe pas les chaînes avec des variables d'environnement (c'est-à-dire %temp%).

Si vous souhaitez utiliser des variables d'environnement pour créer le FileName propriété alors vous devrez récupérer les variables d'environnement (en utilisant le GetEnvironmentVariable méthode sur le Environment classe) et effectuez la substitution vous-même, comme ceci :

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

De plus, vous pouvez utiliser le ExpandEnvironmentVariables méthode avec votre chaîne d'origine comme ceci :

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

Autres conseils

Le %temp% Une partie de la chaîne est interprétée littéralement au lieu d'être remplacée par la variable d'environnement appropriée.Vous devrez l'étendre manuellement

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

% Temp% est analysé et évalué par la coque de commande.Vous pouvez utiliser utiliser chemin.gettempath () et cheminage.combine à cet effet.

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

Vous pouvez utiliser le Environment.ExpandEnvironmentVariables pour développer les variables d'environnement dans une chaîne, puis transmettez-la au Process classe:

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

Cela présente les avantages supplémentaires de

  1. Travailler pour n'importe quelle variable d'environnement (%APPDATA%, %COMMONPROGRAMFILES%, etc.), et
  2. Travailler n'importe où dans la chaîne (par ex."%temp%\%username%\foo.txt")

Essayez ceci:

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

puis concatez-le dans:

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

Casper m'a battu au poinçon sur l'explication, mais la méthode Process.Start le traite essentiellement au lieu de l'intrépaper comme la coque.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top