Domanda

Immagina un file .cmd in stile DOS che viene utilizzato per avviare applicazioni a finestre interdipendenti nell'ordine corretto.

Esempio:
1) Avviare un'applicazione server chiamando un exe con parametri.
2) Attendere l'inizializzazione del server (o un periodo di tempo fisso).
3) Avviare l'applicazione client chiamando un exe con parametri.

Qual è il modo più semplice per eseguire questo tipo di lavoro batch in PowerShell?

È stato utile?

Soluzione

Ricorda che PowerShell può accedere agli oggetti .Net.Lo Start-Sleep come suggerito da Blair Corrado può essere sostituito da una chiamata a WaitForInputIdle del processo del server in modo da sapere quando il server è pronto prima di avviare il client.

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

Potresti anche usare Processo.Avvio per avviare il processo e far sì che restituisca l'esatto Process.Quindi non è necessario il processo get.

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

Altri suggerimenti

@Lars Truijens ha suggerito

Ricorda che PowerShell può accedere agli oggetti .NET.Il sonno di avvio come suggerito da Blair Conrad può essere sostituito da una chiamata a WaitForInputle del processo del server in modo da sapere quando il server è pronto prima di avviare il client.

Questo è più elegante che dormire per un periodo di tempo fisso (o fornito tramite parametro).Tuttavia,WaitForInputIdle

Si applica solo ai processi con un'interfaccia utente e, quindi, un ciclo di messaggi.

quindi potrebbe non funzionare, a seconda delle caratteristiche dell'applicazione launch-server.Tuttavia, come mi ha fatto notare Lars, la domanda si riferiva a a finestrato application (che mi sono persa quando ho letto la domanda), quindi la sua soluzione è probabilmente la migliore.

Per attendere 10 secondi tra l'avvio delle applicazioni, prova

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

Se vuoi creare uno script e farti passare gli argomenti, crea un file chiamato runlinkedapps.ps1 (o qualsiasi altra cosa) con questi contenuti:

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

O comunque tu scelga di distribuire i parametri del server e del client sulla linea che usi per eseguire runlinkedapps.ps1.Se vuoi, potresti anche passare il ritardo qui, invece di codificare 10.

Ricorda, il tuo file .ps1 deve trovarsi sul tuo percorso, altrimenti dovrai specificarne la posizione quando lo esegui.(Oh, e presumo che launch-server-application e launch-client-application siano sul tuo percorso; in caso contrario, dovrai specificare anche il percorso completo per loro.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top