어떻게 ISE 하위 메뉴를 생성하는 동안 Powershell 변수의 값을 문자열로 저장할 수 있습니까?


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

이 코드는 상위 메뉴 항목 인 "Modules"아래에 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의 고유하고 상응하는 값을 원합니다.

이것이 가능한가? 아마도 내가 지적 할 수있는보다 훌륭하고 우아한 접근 방식이 있을까요? 폴더에있는 이름을 검색하는 것보다 액세스 할 수있는 모듈 목록을 얻는 더 좋은 방법이 있다는 것을 알고 있지만 원본과 관계없이 변수에서 잘못된 (마지막 값)을 전달하는 것과 같은 문제로 끝날 것이라고 생각합니다. .

감사.

답변:


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
    )
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.