Вопрос

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

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();
Это было полезно?

Решение

А 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");

Другие советы

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

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

% Temp% проанализирован и оценивается командной оболочкой.Вы можете использовать использование path.gettemppath () и path.combine для этой цели.

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

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

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

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

  1. Работа для любой переменной окружающей среды (% appdata%,% commonprogramfiles%, и т.д.), а также
  2. Работает в любом месте строки (например, Temp% \% username% \ foo.txt ")

Попробуйте:

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

Тогда объединяйте его:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top