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();
Foi útil?

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

  1. Trabalhando para qualquer variável de ambiente (%APPDATA%,%COMMONPROGRAMFILES%, etc), e
  2. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top