2012-03-12 6 views
3

В течение некоторого нечетного reaseon этот код не: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(); 
+0

Возможно, что вам нужно: http://stackoverflow.com/questions/4348003/using-environment-variable-in-a-file- путь – Alex

+0

См. http: // stackoverflow.com/questions/1013383/how-can-an-application-access-the-environment-variable-set-by-another-applyatio Процесс запуска не расширяет переменные среды. – Chriseyre2000

+0

Я не нашел его перед отправкой (я искал какое-то время) – Diego

ответ

4

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

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

// 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 method с исходной строкой следующим образом:

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

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

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

Отличный !! Благодаря! BTW: Я изменил string.Concat для Path.Combine, я думаю, что здесь более уместно. – Diego

+1

Path.Combine почти всегда более подходит, чем string.Concat, когда вы имеете дело с именами файлов или путей; он выполняет всю логику разделителя пути (и диска) для вас, а затем делает строку. Контактуйте в любом случае. –

+0

Обновлено уже :) –

0

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

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

Тогда CONCAT его в:

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

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

1

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

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

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

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

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

  1. Работа для любой переменной среды (% APPDATA%,% COMMONPROGRAMFILES%, и т.д.), и
  2. Рабочих в любом месте строки (например, "% Temp% \% имя пользователя% \ foo.txt")