Powershell: utilise un groupe de commandes ajoutées dynamiquement dans une nouvelle fenêtre

1

Je me bats avec quelque chose qui devrait être évidemment simple mais qui ne semble pas si simple à résoudre. J'ai une séquence dynamique de commandes Powershell à exécuter. Cela fait partie de certains modèles que j'ai écrits pour moi-même afin de me faciliter la tâche dans mon flux de travail.

Voici un exemple simple de commandes groupées générées:

$commands = {
  Write-Output "Navigating to tools->deploy";
  Set-Location "C:\tools\deploy\";
  Write-Output "OK. Run dd.ps1 [server name] to deploy.";
}

Il est possible de lancer ceci $commandsen utilisant Invoke-Command. Donc, finalement, j'ai cette fonction qui le gère:

function invokeNow() {
  param([string]$c)
  Invoke-Command $c;
} 

Cela fonctionne bien. Il exécute les commandes dans l'objet dans la fenêtre. Mais avec le temps, j'y ai ajouté plus de fonctionnalités. Pour chaque nouvelle instruction, je dois ouvrir PowerShell à chaque fois ... C'est parce que, parfois, lorsqu'un script est en cours d'exécution, je ne peux pas émettre une autre fonction. Mon objectif est donc maintenant d'exécuter le groupe de commandes ci-dessus dans une nouvelle fenêtre afin de pouvoir utiliser une même fenêtre de shell pour appeler plusieurs tâches ( exécutées dans leurs propres fenêtres). Je pensais que ce serait simple, alors j'ai modifié la fonction pour

function invokeNow() {
  param([string]$c)
  Invoke-Expression "cmd /c start powershell -Command {$c} -NoProfile -NoExit";
} 

Cela conduit à ce résultat:

#< CLIXML
#< CLIXML
PS C:\tools\deploy\>

La navigation a fonctionné. Cependant, mes informations de sortie sont perdues. Certaines commandes ont ajouté des instructions telles que deploy S1 fooou deploy FS -src "data". Celles-ci sont difficiles à mémoriser parfois. Pour cela, j'ai deux petites questions: (1) Où sont mes Write-Outputdonnées? Et (2) quelle est cette CLIXMLchose étrange (semble "spécial" XML PowerShell selon Google)? Lorsque je demande exità fermer cette fenêtre, je vois un tas de choses XML avant que la fenêtre ne se ferme.

Question principale

Est-il possible d'ouvrir une nouvelle fenêtre PowerShell, puis d' exécuter $commandscorrectement les commandes de mon objet (y compris les Write-Outputdonnées)?

J'ai déjà essayé d'ajouter Invoke-Commandà ce qui précède comme

Invoke-Expression "cmd /c start powershell -Command {Invoke-Command -ScriptBlock $c} -NoProfile -NoExit";

mais la nouvelle fenêtre crache beaucoup de choses XML ...

ps la folie


informations de version

PS C:\> $PSVersionTable
Name                           Value
----                           -----
PSVersion                      5.1.16299.251
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.16299.251
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
KarelG
la source
Je suppose que ma première question serait pourquoi? Pourquoi pensez-vous que vous avez besoin de stocker les commandes sous forme de blocs de script, puis de les exécuter dans une console séparée. Pourquoi ne pas utiliser des fonctions et des emplois?
EBGreen
Un groupe est généré en appelant plusieurs fonctions: par exemple, il Write-Output "Navigating to tools->deploy"; Set-Location "C:\tools\deploy\";provient d'une fonction qui vous permet d'accéder à un répertoire. Par cela, je n'ai pas à écrire les deux lignes plusieurs fois. Je voudrais suivre ma navigation dans les répertoires. Je pourrais aussi ajouter des noms de fonctions, mais je pense que c'est plus difficile à résoudre.
KarelG
Je ne sais pas ce que vous entendez par plus difficile à résoudre. Quoi qu'il en soit, je suggérerais simplement d'écrire le script pour faire ce que vous voulez faire, puis exécutez le script dans l'autre console. Vous ne savez pas pourquoi vous avez besoin d’une autre console pour être honnête avec vous.
EBGreen