Wie kann ich den Wert einer Powershell-Variablen beim Erstellen von ISE-Untermenüs als Zeichenfolge speichern?

483
Carlos Serpa

Ich kann mein Problem in den Suchmaschinen nicht gut genug formulieren, um die Antwort zu finden, nach der ich suche. Ich wende mich an die Community, um Hilfe zu erhalten:

Ich möchte das PowerShell-ISE-Menü mit Untermenüelementen füllen, die wiederum mit einer Liste von Modulen in einem Verzeichnis gefüllt sind, sodass ich das Modul mit ein paar Mausklicks laden kann.

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

Der Code funktioniert wie erwartet, indem eine Liste von 20 neuen Untermenüelementen unter dem übergeordneten Menüelement "Module" erstellt wird, aber wenn ich auf eines dieser Untermenüelemente klicke:

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 

Der Wert "_Connect-Office365Service" ist der letzte von der foreach-Anweisung verarbeitete Wert oder Ordner. Ich möchte, dass der eindeutige und entsprechende Wert von $ folder für jeden gefundenen Ordnernamen Teil des Untermenüelements ist.

Ist das möglich? Vielleicht gibt es einen besseren, eleganteren Ansatz, auf den ich hingewiesen werden kann? Ich weiß, es gibt bessere Möglichkeiten, eine Liste von Modulen zu erhalten, auf die ich Zugriff habe, als nach Namen in einem Ordner zu suchen. Unabhängig von der Quelle denke ich, dass ich das gleiche Problem habe, den falschen Wert (letzter Wert) aus der Variablen zu übergeben .

Vielen Dank.

1

1 Antwort auf die Frage

0
JosefZ

Lesen und befolgen Sie das Problem mit der Variablenerweiterung in einem Skriptblock in der Variablenersetzung in einem PowerShell-Skriptblock lösen :

Um eine Variable innerhalb eines Skriptblocks zu erweitern, müssen Sie zwei Dinge tun:

  • Erstellen Sie den Skriptblock als Erweiterungsstring.
  • Verwenden Sie die statische CreateMethode aus der [scriptblock]Klasse. Dadurch wird ein Skriptblock erstellt.

Das obige Zitat ist leicht abgeschnitten. Sie können Ihr Skript wie folgt ändern (entsprechende ###Kommentare beachten ):

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