Question

Imaginez un fichier .cmd de style DOS utilisé pour lancer des applications fenêtrées interdépendantes dans le bon ordre.

Exemple:
1) Lancez une application serveur en appelant un exe avec des paramètres.
2) Attendez que le serveur soit initialisé (ou pendant une durée déterminée).
3) Lancez l'application client en appelant un exe avec des paramètres.

Quelle est la manière la plus simple d’accomplir ce type de travail par lots dans PowerShell ?

Était-ce utile?

La solution

N'oubliez pas que PowerShell peut accéder aux objets .Net.Le Start-Sleep comme suggéré par BlairConrad peut être remplacé par un appel au WaitForInputIdle du processus serveur afin que vous sachiez quand le serveur est prêt avant de démarrer le client.

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

Vous pouvez également utiliser Processus.Démarrer pour démarrer le processus et lui faire renvoyer le processus exact.Ensuite, vous n'avez pas besoin du processus get.

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

Autres conseils

@Lars Truijens a suggéré

N'oubliez pas que PowerShell peut accéder aux objets .NET.Le début-sommeil comme suggéré par Blair Conrad peut être remplacé par un appel à WaitForInputIdle du processus du serveur afin que vous sachiez quand le serveur est prêt avant de démarrer le client.

C'est plus élégant que de dormir pendant une durée fixe (ou fournie via un paramètre).Cependant,WaitForInputIdle

s'applique uniquement aux processus avec une interface utilisateur et, par conséquent, à une boucle de message.

cela peut donc ne pas fonctionner, en fonction des caractéristiques de l'application du serveur de lancement.Cependant, comme Lars me l'a fait remarquer, la question faisait référence à un fenêtré application (que j'ai manquée en lisant la question), donc sa solution est probablement la meilleure.

Pour attendre 10 secondes entre les lancements des applications, essayez

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

Si vous souhaitez créer un script et transmettre les arguments, créez un fichier appelé runlinkedapps.ps1 (ou autre) avec ce contenu :

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

Ou quelle que soit la manière dont vous choisissez de distribuer les paramètres du serveur et du client sur la ligne que vous utilisez pour exécuter runlinkedapps.ps1.Si vous le souhaitez, vous pouvez même transmettre le délai ici, au lieu de coder en dur 10.

N'oubliez pas que votre fichier .ps1 doit se trouver sur votre chemin, sinon vous devrez spécifier son emplacement lorsque vous l'exécuterez.(Oh, et j'ai supposé que l'application serveur de lancement et l'application client de lancement se trouvaient sur votre chemin - sinon, vous devrez également spécifier le chemin complet d'accès.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top