1 votes

Comment puis-je stocker la valeur d'une variable Powershell sous forme de chaîne de caractères lors de la création de sous-menus ISE ?

Je ne parviens pas à formuler mon problème suffisamment bien dans les moteurs de recherche pour trouver la réponse que je cherche, alors je me tourne vers la communauté pour obtenir de l'aide :

Je veux remplir le menu de mon ISE Powershell avec des éléments de sous-menu qui sont à leur tour remplis par une liste de modules dans un répertoire afin que je puisse charger le module en quelques clics de souris.

$parentProfile = $psISE.CurrentPowerShellTab.AddOnsMenu.SubMenus.Add("Modules",$null,$null)
$mymodules = gci $env:USERPROFILE\documents\windowspowershell\modules |
?{ $_.PSIsContainer } | select name -ExpandProperty name

$i = 0 
foreach ($folder in $mymodules) {
$parentProfile.SubMenus.Add(
 "$folder", {
Import-Module -Name $folder
},
$null # keyboard shortcut
)
}

Le code fonctionne comme prévu en créant une liste de 20 nouveaux éléments de sous-menu sous l'élément de menu parent "Modules" mais lorsque je clique sur l'un de ces éléments de sous-menu :

Import-Module : The specified module '_Connect-Office365Service' was not loaded because no valid module file was found in any module directory.
At line:2 char:2
+  Import-Module -Name $folder
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : ResourceUnavailable: (_Connect-Office365Service:String) [Import-Module], FileNotFoundException
+ FullyQualifiedErrorId : Modules_ModuleNotFound,Microsoft.PowerShell.Commands.ImportModuleCommand

La valeur "_Connect-Office365Service" est la dernière valeur ou le dernier dossier traité par l'instruction foreach. Je veux que la valeur unique et correspondante de $folder pour chaque nom de dossier trouvé fasse partie de l'élément de sous-menu créé.

Est-ce possible ? Peut-être existe-t-il une meilleure approche, plus élégante, que l'on peut m'indiquer ? Je sais qu'il y a de meilleures façons d'obtenir une liste de modules auxquels j'ai accès que de chercher des noms dans un dossier, mais quelle que soit la source, je pense que je me retrouve avec le même problème de passer la mauvaise (dernière valeur) de la variable.

Merci.

0voto

JosefZ Points 11907

Lire et suivre Résoudre le problème de l'expansion des variables dans un bloc script. en Substitution de variables dans un bloc PowerShell script. :

La solution pour étendre une variable à l'intérieur d'un bloc script consiste à faire deux choses :

  • créer le bloc script en tant que chaîne en expansion.
  • utiliser l'option statique Create de la méthode [scriptblock] ce qui créera un bloc script.

La citation ci-dessus est légèrement tronquée. Vous pourriez modifier votre script de la manière suivante (notez les éléments appropriés ### commentaires) :

$parentProfile = $psISE.CurrentPowerShellTab.AddOnsMenu.SubMenus.Add("Modules",$null,$null)
$mymodules = Get-ChildItem $env:USERPROFILE\documents\windowspowershell\modules |
    Where-Object { $_.PSIsContainer } | 
        Select-Object name -ExpandProperty name
$i = 0 
foreach ($folder in $mymodules) {
    $auxStringBlock = "Import-Module -Name $folder" ### create the script block as an expanding string.
    $parentProfile.SubMenus.Add(
        "$folder", 
        [scriptblock]::Create( $auxStringBlock), ### use the static `Create` method from the `[scriptblock]` class
        $null  # keyboard shortcut
    )
}

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X