Имя файла Process.Start с использованием %temp%

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

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

person Diego    schedule 12.03.2012    source источник
comment
Возможно, вам нужно: stackoverflow. ком/вопросы/4348003/   -  person Alex    schedule 13.03.2012
comment
См. stackoverflow.com/questions/1013383/ Запуск процесса не расширяет переменные среды.   -  person Chriseyre2000    schedule 13.03.2012
comment
Я не нашел его перед публикацией (я искал некоторое время)   -  person Diego    schedule 13.03.2012


Ответы (5)


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

Если вы хотите использовать переменные среды для создания свойства FileName< /a>, то вам нужно будет получить переменные среды (используя метод GetEnvironmentVariable< /a> в классе 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");
person casperOne    schedule 12.03.2012

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

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

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

p.StartInfo.FileName = Path.Combine(Path.GetTempPath(), @"SSCERuntime_x86-ENU.msi");
person amit_g    schedule 12.03.2012
comment
Здорово!! Спасибо! Кстати: я изменил string.Concat на Path.Combine, я думаю, что здесь это более уместно. - person Diego; 13.03.2012
comment
Path.Combine почти всегда более подходит, чем string.Concat, когда вы имеете дело с именами файлов или путей; он выполняет всю логику разделителя пути (и диска) за вас, а затем все равно делает string.Contact. - person Michael Edenfield; 13.03.2012

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

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

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

  1. Работает для любой переменной среды (%APPDATA%, %COMMONPROGRAMFILES% и т. д.) и
  2. Работа в любом месте строки (например, "%temp%\%username%\foo.txt")
person Michael Edenfield    schedule 12.03.2012

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

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

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

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

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

person Todd Richardson    schedule 12.03.2012