Exécutez un script interactif PowerShell «maître» sur un PC local ainsi que sur des PC distants et connectez-vous

J’ai un énorme script interactif PowerShell (983 lignes) que j’ai écrit pour gérer pratiquement tous les aspects d’un serveur local. J’ai un fichier texte avec une liste de serveurs. Je veux devenir fou avec ça.

Contenu du fichier texte:

Server1Name Server2Name 

Menu interactif PowerShell:

 Write-Host "Welcome to the environment control script." Write-Host " " Write-Host "What would you like to do? Select the number:" Write-Host "=========================================================================" Write-Host "1. Create a backup of the environment (existing servers)" Write-Host "2. Backup environment and deploy updated environment (existing servers)" Write-Host "3. Deploy new environment including IIS (clean servers)" Write-Host "4. Deploy just IIS (clean servers)" Write-Host "5. Remove Build w/ backup and cleanup IIS (existing servers)" Write-Host "6. Remove Build w/out backup and cleanup IIS (existing servers)" Write-Host "7. Remove and cleanup only IIS (existing servers)" Write-Host "8. Deploy new DLL's (existing servers)" Write-Host "9. [EXIT]" -foregroundcolor "yellow" Write-Host " " 

Objectif:

Essayer d’échapper à 1000 fichiers de commandes sur mes serveurs

Exemple:

Je lance un script sur le serveur “Master” et il y a 10 autres serveurs dans le fichier texte. Au début, le script s’exécute UNIQUEMENT sur le serveur maître. Une fois l’option 6 sélectionnée, une commande est exécutée pour exécuter les mêmes commandes sur l’ensemble des 11 serveurs (master + 10 autres).

Je sais comment exécuter le même script sur tous les serveurs, par exemple, une simple copie de fichier ou une réinitialisation du service (pas d’interaction de la part de l’utilisateur) utilisant des méthodes telles que invoke-command ou enter-pssession , etc. devra être distant sur chaque serveur car il est interactif … à moins qu’il y ait un moyen de le faire?

En outre, si possible, activez la journalisation pour pouvoir confirmer que chaque PC a exécuté le script et a tout fait avec succès. En ce moment, je commence une transcription et je m’arrête à la fin. Fonctionne très bien localement.

Toute aide serait appréciée.

Mise à jour: 3/8/16

Donc, @Cobster m’a aidé et nous y sums à 99%.

En utilisant le code suivant, il semble que le script tente de s’exécuter, mais il y a un autre problème.

 $sessions = New-PSSession -ComputerName $servers $job = Invoke-Command -Session $sessions -ScriptBlock ${function:Backup} -AsJob If you want a different job for each machine, you can do the following: $jobs = $sessions | ForEach-Object { Invoke-Command -Session $_ -ScriptBlock ${function:Backup} -AsJob } Wait-Job -Job $jobs 

Le problème est que lorsque cela est fait, la commande invoke ne semble pas importer toutes les variables précédemment déclarées en haut de mon script (ce qui inclut pratiquement TOUS mes chemins, etc. car ils ne sont pas définis dans cette fonction). .

Cela se traduit par un tas de ces types d’erreurs (7 pour être exact, un pour chacune de mes vérifications avant d’effectuer une étape):

 Cannot bind argument to parameter 'Path' because it is null. + CategoryInfo : InvalidData: (:) [Test-Path], ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.TestPathCommand + PSComputerName : *ServerName* 

Solution:

Utilisez -ArgumentList $variable1, $variable2 dans la invoke-command et

méthode param ( $variable1, $variable2 ) dans la fonction … avec la permission de Cobster.

Invoke-Command peut être exécuté en arrière-plan à l’aide du commutateur -AsJob.

La journalisation est également possible en utilisant l’applet de commande Receive-Job pour obtenir la sortie de chaque tâche en arrière-plan à la fin.