Имя файла Process.Start с использованием %temp%
-
12-12-2019 - |
Вопрос
По какой-то странной причине этот код не работает:
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");
.
Это имеет дополнительные преимущества
- Работа для любой переменной окружающей среды (% appdata%,% commonprogramfiles%, и т.д.), а также
- Работает в любом месте строки (например, Temp% \% username% \ foo.txt ")
Попробуйте:
string tempPath = Environment.GetEnvironmentVariable("Temp");
.
Тогда объединяйте его:
p.StartInfo.FileName = Path.Combine(tempPath, "SSCERuntime_x86-ENU.msi");
.
Casper избил меня на удар по объяснению, но метод Process.Start в основном относится к нему буквально, а не вторгивает его, так как оболочка.