Pergunta

Imagine um arquivo .cmd estilo DOS que é usado para iniciar aplicativos em janelas interdependentes na ordem correta.

Exemplo:
1) Inicie um aplicativo de servidor chamando um exe com parâmetros.
2) Aguarde a inicialização do servidor (ou um período fixo de tempo).
3) Inicie o aplicativo cliente chamando um exe com parâmetros.

Qual é a maneira mais simples de realizar esse tipo de trabalho em lote no PowerShell?

Foi útil?

Solução

Lembre-se de que o PowerShell pode acessar objetos .Net.O Start-Sleep sugerido por Blair Conrado pode ser substituído por uma chamada para WaitForInputIdle do processo do servidor para que você saiba quando o servidor está pronto antes de iniciar o cliente.

$sp = get-process server-application
$sp.WaitForInputIdle()

Você também pode usar Processo.Iniciar para iniciar o processo e fazer com que ele retorne o processo exato.Então você não precisa do processo get.

$sp = [diagnostics.process]::start("server-application", "params")
$sp.WaitForInputIdle()
$cp = [diagnostics.process]::start("client-application", "params")

Outras dicas

@Lars Truijens sugeriu

Lembre -se de que o PowerShell pode acessar objetos .NET.O sono inicial, conforme sugerido por Blair Conrad, pode ser substituído por uma chamada para WaitForInputIdle do processo do servidor para que você saiba quando o servidor está pronto antes de iniciar o cliente.

Isso é mais elegante do que dormir por um período de tempo fixo (ou fornecido por parâmetro).No entanto,WaitForInputIdle

Aplica -se apenas aos processos com uma interface do usuário e, portanto, um loop de mensagem.

portanto, isso pode não funcionar, dependendo das características do aplicativo do servidor de inicialização.Contudo, como Lars me salientou, a questão referia-se a um janela aplicação (que perdi quando li a pergunta), então a solução dele é provavelmente a melhor.

Para esperar 10 segundos entre o lançamento dos aplicativos, tente

launch-server-application serverparam1 serverparam2 ...
Start-Sleep -s 10
launch-client-application clientparam1 clientparam2 clientparam3 ...

Se você deseja criar um script e receber os argumentos, crie um arquivo chamado runlinkedapps.ps1 (ou qualquer outro) com este conteúdo:

launch-server-application $args[0] $args[1]
Start-Sleep -s 10
launch-client-application $args[2] $args[3] $args[4]

Ou como você decidir distribuir os parâmetros do servidor e do cliente na linha usada para executar runlinkedapps.ps1.Se quiser, você pode até passar o atraso aqui, em vez de codificar 10.

Lembre-se de que seu arquivo .ps1 precisa estar em seu caminho ou você terá que especificar seu local ao executá-lo.(Ah, e presumi que launch-server-application e launch-client-application estão no seu caminho - caso contrário, você precisará especificar o caminho completo para eles também.)

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