Как я могу сохранить значение переменной Powershell в виде строки при создании подменю ISE

311
Carlos Serpa

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

Я хочу заполнить меню моего 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. Я хочу, чтобы уникальное и соответствующее значение $ folder для каждого найденного имени папки было частью созданного элемента подменю.

Это возможно? Возможно, есть лучший, более элегантный подход, на который я могу указать? Я знаю, что есть лучшие способы получить список модулей, к которым у меня есть доступ, чем поиск имен в папке, но, независимо от источника, я думаю, что в конечном итоге я сталкиваюсь с той же проблемой передачи неправильного (последнего значения) из переменной ,

Благодарю.

1

1 ответ на вопрос

0
JosefZ

Прочтите и следуйте Решению проблемы с расширением переменной в блоке сценария в Подстановке переменной в блоке сценария 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 ) }