![如何在创建 ISE 子菜单时将 Powershell 变量的值存储为字符串](https://linux22.com/image/1568739/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%88%9B%E5%BB%BA%20ISE%20%E5%AD%90%E8%8F%9C%E5%8D%95%E6%97%B6%E5%B0%86%20Powershell%20%E5%8F%98%E9%87%8F%E7%9A%84%E5%80%BC%E5%AD%98%E5%82%A8%E4%B8%BA%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
我似乎无法在搜索引擎中很好地表达我的问题以找到我正在寻找的答案,因此我向社区寻求帮助:
我想用子菜单项填充我的 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
阅读并关注解决脚本块中的变量扩展问题在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
)
}