Como você executa um programa que não sabe onde os argumentos começam?
-
03-07-2019 - |
Pergunta
O assunto não diz muito porque não é fácil questionar em uma linha. Eu tenho que executar alguns programas que li no registro. Eu tenho que ler de um campo onde alguém salva todos os caminhos e argumentos.
Eu tenho usado o System.diagnostics.processstartinfo definindo o nome do programa e seus argumentos, mas encontrei uma ampla variedade de argumentos que tenho que analisar para salvar o arquivo executável do processo em um campo e seus argumentos no outro.
Existe uma maneira de executar toda a string como está?
Solução
Eu abordei isso da mesma maneira que o pôster acima, usando o cmd.exe com informações iniciais do processo.
Process myProcess = New Process;
myProcess.StartInfo.FileName = "cmd.exe";
myProcess.StartInfo.Arguments = "/C " + cmd;
myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
myProcess.StartInfo.CreateNoWindow = True;
myProcess.Start();
myProcess.WaitForExit();
myProcess.Close();
O CMD /C realiza o comando e termina. Waitforexit encerrará o processo se ele for por muito tempo.
Outras dicas
Existem vários, de fato.
- Você pode ligar para o cmd.exe com /c [sua linha de comando] como os argumentos. Isso faz com que o cmd.exe processe seu comando e depois pare.
- Você pode escrever o comando em um arquivo em lote e iniciá -lo.
E é claro que há a abordagem que você está adotando agora, a saber, analisando a linha de comando.
Quando 'Usashellexecute'não está definido, system.diagnostics.process chama CreateProcess ou CreateProcesSasUser Para realmente iniciar um programa (ele usa o segundo se você especificar um usuário/domínio/senha). E ambas as chamadas podem assumir o comando e o arquivo como um único argumento. De msdn:
O parâmetro LPApplicationName pode ser nulo. Nesse caso, o nome do módulo deve ser o primeiro token branco -alimido no espaço branco na string lpCommandline. ...
O nome do LPApplication mapeia o ProcessStartInfo.FileName e o LPCommandline Maps para os argumentos. Então você deve estar e apenas ir:
var processStartInfo = new ProcessStartInfo()
{
UseShellExecute = false,
Arguments = cmd
};
Process.Start(processStartInfo);