Nome do arquivo Process.Start usando% temp%
-
12-12-2019 - |
Pergunta
Por algum motivo estranho, esse código falha:
p.StartInfo.FileName = @"%temp%\SSCERuntime_x86-ENU.msi";
e este código é bem-sucedido:
p.StartInfo.FileName = @"C:\Users\USERNAME\AppData\Local\Temp\SSCERuntime_x86-ENU.msi";
Existe algum motivo para eu estar desaparecido?
Observação Acabei de copiar o caminho, não acho que o restante do código seja necessário mas vou colocar mesmo assim:
Process p = new Process();
p.StartInfo.FileName = @"%temp%\SSCERuntime_x86-ENU.msi";
p.StartInfo.Arguments = "/passive";
p.Start();
Solução
O Process
aula não expande strings com variáveis de ambiente (ou seja, %temp%
).
Se você quiser usar variáveis de ambiente para construir o FileName
propriedade então você terá que obter as variáveis de ambiente (usando o GetEnvironmentVariable
método no Environment
aula) e faça você mesmo a substituição, assim:
// 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();
Além disso, você pode usar o ExpandEnvironmentVariables
método com sua string original assim:
p.StartInfo.FileName =
Environment.ExpandEnvironmentVariables(@"%temp%\SSCERuntime_x86-ENU.msi");
Outras dicas
O %temp%
parte da string está sendo interpretada literalmente em vez de ser substituída pela variável de ambiente apropriada.Você precisará expandi-lo manualmente
var temp = Environment.GetEnvironmentVariable("temp");
var fileName = Path.Combine(temp, "SSCERuntime_x86-ENU.msi");
p.StartInfo.FileName = fileName;
%TEMP% é analisado e avaliado pelo Command Shell.Você poderia usar usar Path.GetTempPath() e Caminho.Combinar para este propósito.
p.StartInfo.FileName = Path.Combine(Path.GetTempPath(), @"SSCERuntime_x86-ENU.msi");
Você pode usar o Environment.ExpandEnvironmentVariables
para expandir variáveis de ambiente dentro de uma string e, em seguida, passe isso para o Process
aula:
p.StartInfo.FileName = Environment.ExpandEnvironmentVariables(@"%temp%\SSCERuntime_x86-ENU.msi");
Isto tem os benefícios adicionais de
- Trabalhando para qualquer variável de ambiente (%APPDATA%,%COMMONPROGRAMFILES%, etc), e
- Trabalhando em qualquer lugar da string (por exemplo"%temp%\%nomedeusuário%\foo.txt")
Experimente isto:
string tempPath = Environment.GetEnvironmentVariable("Temp");
Então concat em:
p.StartInfo.FileName = Path.Combine(tempPath, "SSCERuntime_x86-ENU.msi");
Casper me adiantou na explicação, mas o método Process.Start basicamente a trata literalmente, em vez de interrompê-la como o shell faria.