Як я можу зберігати значення змінної Powershell як рядок під час створення підменю ISE


1

Я не можу досить чітко сформулювати свою проблему в пошукових системах, щоб знайти відповідь, яку шукаю, тому звертаюся за допомогою до громади:

Я хочу заповнити меню свого Powershell ISE пунктами підменю, які в свою чергу заповнені переліком модулів у каталозі, щоб я міг завантажувати модуль пару клацань миші.

$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
)
}

Код працює так, як очікувалося, створюючи список 20 нових елементів підменю під батьківським пунктом меню "Модулі", але коли я натискаю будь-який із цих елементів підменю:

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

Значення "_Connect-Office365Service" - це останнє значення або папка, оброблена оператором foreach. Я хочу, щоб унікальне і відповідне значення папки $ для кожної назви папки було визнано частиною створеного елемента підменю.

Чи можливо це? Можливо, є кращий, більш елегантний підхід, на який я можу вказати? Я знаю, що є кращі способи отримати список модулів, до яких я маю доступ, ніж шукати імена в папці, але незалежно від джерела, я думаю, що я стикаюся з тією ж проблемою передачі неправильної (останнього значення) зі змінної .

Дякую.

Відповіді:


0

Прочитайте та дотримуйтесь Вирішення проблеми зі змінним розширенням в блоці скриптів у змінній підстанові в блоці скриптів PowerShell :

Рішення для розширення змінної всередині блоку сценарію полягає в тому, щоб зробити дві речі:

  • створити блок сценарію як рядок, що розширюється.
  • використовувати статичний Createметод з [scriptblock]класу; це створить блок скриптів.

Вище цитування трохи урізане. Ви можете змінити свій сценарій наступним чином (зверніть увагу на відповідні ###коментарі):

$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
    )
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.