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 $commands
en 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 foo
ou deploy FS -src "data"
. Celles-ci sont difficiles à mémoriser parfois. Pour cela, j'ai deux petites questions: (1) Où sont mes Write-Output
données? Et (2) quelle est cette CLIXML
chose é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 $commands
correctement les commandes de mon objet (y compris les Write-Output
donné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 ...
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
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.