Process.Start имя файла с использованием% temp% - PullRequest
3 голосов
/ 13 марта 2012

По какой-то странной причине этот код завершается ошибкой:

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

и этот код успешно выполняется:

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

Есть ли какая-то причина, по которой я пропускаю?

Примечание Я только что скопировал путь, я не думаю, что остальная часть кода нужна, но я все равно его вставлю:

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

Ответы [ 5 ]

4 голосов
/ 13 марта 2012

Класс Process не расширяет строки переменными среды (т. Е. %temp%).

Если вы хотите использовать переменные среды для построения FileNameсвойство , тогда вам придется получить переменные окружения (используя GetEnvironmentVariable метод для Environment класс ) и выполнить подстановку самостоятельно, например так:

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

Кроме того, вы можете использовать ExpandEnvironmentVariables метод со своей исходной строкой, например:

p.StartInfo.FileName = 
    Environment.ExpandEnvironmentVariables(@"%temp%\SSCERuntime_x86-ENU.msi");
1 голос
/ 13 марта 2012

Часть строки %temp% интерпретируется буквально, а не заменяется соответствующей переменной среды.Вам нужно будет вручную расширить его

var temp = Environment.GetEnvironmentVariable("temp");
var fileName = Path.Combine(temp, "SSCERuntime_x86-ENU.msi");
p.StartInfo.FileName = fileName;
0 голосов
/ 13 марта 2012

Вы можете использовать Environment.ExpandEnvironmentVariables для расширения переменных среды внутри строки, а затем передать это классу Process:

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

. Это дает дополнительные преимущества

  1. Работа для любой переменной среды (% APPDATA%,% COMMONPROGRAMFILES% и т. Д.) И
  2. Работа в любом месте строки (например, "% temp% \% username% \ foo.txt")
0 голосов
/ 13 марта 2012

Попробуйте это:

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

Затем объедините его в:

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

Каспер опередил меня в объяснении, но метод Process.Start рассматривает его буквально вместо этоговводить его как оболочку.

0 голосов
/ 13 марта 2012

% TEMP% анализируется и оценивается командной оболочкой. Вы можете использовать Path.GetTempPath () и Path.Combine для этой цели.

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