Como posso armazenar o valor de uma variável Powershell como uma string enquanto cria submenus do ISE?

1

Não consigo articular bem o meu problema nos motores de busca para encontrar a resposta que procuro, por isso, dirijo-me à comunidade para pedir ajuda:

Eu quero preencher o menu do meu Powershell ISE com itens de submenu que, por sua vez, são preenchidos por uma lista de módulos em um diretório para que eu possa carregar o módulo com alguns cliques do mouse.

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

O código funciona como esperado, criando uma lista de 20 novos itens de submenu sob o item de menu pai "Módulos", mas quando clico em qualquer um desses itens de submenu:

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

O valor "_Connect-Office365Service" é o último valor ou pasta processada pela instrução foreach. Eu quero o valor único e correspondente de $ pasta para cada nome de pasta encontrado para fazer parte do item de submenu criado.

Isso é possível? Talvez haja uma abordagem melhor e mais elegante para a qual eu possa ser apontado? Eu sei que há melhores maneiras de obter uma lista de módulos que eu tenho acesso do que procurar por nomes em uma pasta, mas independentemente da fonte eu acho que acabo com o mesmo problema de passar o errado (último valor) da variável .

obrigado.

    
por Carlos Serpa 24.08.2018 / 01:17

1 resposta

0

Ler e seguir Resolvendo o problema com a expansão de variáveis em um bloco de scripts em Substituição de variável em um bloco de script do PowerShell :

The solution to expanding a variable inside a script block is to do two things:

  • create the script block as an expanding string.
  • use the static Create method from the [scriptblock] class; this will create a script block.

A citação acima é ligeiramente truncada. Você pode modificar seu script da seguinte forma (observe os ### comentários apropriados):

$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
    )
}
    
por 16.09.2018 / 16:10