A UseShellExecutepropriedade booleana está relacionada ao uso da função ShellExecute do Windows versus a função CreateProcess - a resposta curta é que, se UseShellExecutefor verdadeira, a Processclasse usará a ShellExecutefunção, caso contrário, ela a usará CreateProcess.
A resposta mais longa é que a ShellExecutefunção é usada para abrir um programa ou arquivo especificado - é praticamente equivalente a digitar o comando a ser executado na caixa de diálogo de execução e clicar em OK, o que significa que pode ser usado (por exemplo):
- Abra arquivos .html ou web usando o navegador padrão sem precisar saber o que é esse navegador,
- Abra um documento do Word sem precisar saber qual é o caminho de instalação do Word
- Execute qualquer comando no
PATH
Por exemplo:
Process p = new Process();
p.StartInfo.UseShellExecute = true;
p.StartInfo.FileName = "www.google.co.uk";
p.Start();
É muito fácil de usar, versátil e poderoso, porém vem com algumas desvantagens:
Não é possível redirecionar os identificadores padrão de entrada / saída / erro
Não é possível especificar descritores de segurança (ou outras coisas interessantes) para o processo filho
Existe a possibilidade de introduzir vulnerabilidades de segurança se você fizer suposições sobre o que realmente será executado:
// If there is an executable called "notepad.exe" somewhere on the path
// then this might not do what we expect
p.StartInfo.FileName = "notepad.exe";
p.Start();
CreateProcessé uma maneira muito mais precisa de iniciar um processo - não pesquisa o caminho e permite redirecionar a entrada ou saída padrão do processo filho (entre outras coisas). A desvantagem, CreateProcessporém, é que nenhum dos três exemplos que dei acima funcionará (tente e veja).
Em resumo, você deve definir UseShellExecutecomo false se:
- Você deseja redirecionar a entrada / saída / erro padrão (esse é o motivo mais comum)
- Você não deseja procurar o caminho pelo executável (por exemplo, por razões de segurança)
Por outro lado, você deve manter- UseShellExecutese verdadeiro se desejar abrir documentos, URLs ou arquivos em lotes, etc ... em vez de precisar explicitamente dar o caminho para um executável.
processStartInfo.RedirectStandardOutput=true, parece-me que você ainda pode redirecionar a saída padrão fazendo issoprocess.Arguments= "cmd /c dir >c:\\crp\\a.a". Da mesma forma a partir de uma caixa de diálogo Executar você pode fazercmd /c dir>c:\crp\a.a