programing

PowerShell 모듈이 장착되어 있는지 확인하는 방법

minimums 2023. 4. 8. 08:19
반응형

PowerShell 모듈이 장착되어 있는지 확인하는 방법

모듈이 존재하는지 확인하기 위해 다음을 시도했습니다.

try {
    Import-Module SomeModule
    Write-Host "Module exists"
} 
catch {
    Write-Host "Module does not exist"
}

출력은 다음과 같습니다.

Import-Module : The specified module 'SomeModule' was not loaded because no valid module file was found in any module directory.
At D:\keytalk\Software\Client\TestProjects\Export\test.ps1:2 char:5
+     Import-Module SomeModule
+     ~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ResourceUnavailable: (SomeModule:String) [Import-Module], FileNotFoundException
    + FullyQualifiedErrorId : Modules_ModuleNotFound,Microsoft.PowerShell.Commands.ImportModuleCommand

Module exists

하지 않기 에, 가 표시됩니다.Module exists 비록SomeModule을 사용하다

PowerShell 모듈이 시스템에 설치되어 있는지 여부를 검출할 수 있는 좋은 방법(가능한 한 오류를 생성하지 않는 것이 좋음)이 있습니까?

.ListAvailable " " " "Get-Module:

if (Get-Module -ListAvailable -Name SomeModule) {
    Write-Host "Module exists"
} 
else {
    Write-Host "Module does not exist"
}

모듈의 상태는 다음과 같습니다.

  • 수입된
  • 디스크(또는 로컬 네트워크)에서 사용 가능
  • 온라인 갤러리에서 입수할 수 있다

PowerShell 세션에서 사용할 수 있는 darn을 원하는 경우 이 기능을 수행하거나 실행할 수 없는 경우 종료하는 기능을 다음에 제시합니다.

function Load-Module ($m) {

    # If module is imported say that and do nothing
    if (Get-Module | Where-Object {$_.Name -eq $m}) {
        write-host "Module $m is already imported."
    }
    else {

        # If module is not imported, but available on disk then import
        if (Get-Module -ListAvailable | Where-Object {$_.Name -eq $m}) {
            Import-Module $m -Verbose
        }
        else {

            # If module is not imported, not available on disk, but is in online gallery then install and import
            if (Find-Module -Name $m | Where-Object {$_.Name -eq $m}) {
                Install-Module -Name $m -Force -Verbose -Scope CurrentUser
                Import-Module $m -Verbose
            }
            else {

                # If the module is not imported, not available and not in the online gallery then abort
                write-host "Module $m not imported, not available and not in an online gallery, exiting."
                EXIT 1
            }
        }
    }
}

Load-Module "ModuleName" # Use "PoshRSJob" to test it out

List Available 옵션이 작동하지 않습니다.대신 다음과 같은 기능이 있습니다.

if (-not (Get-Module -Name "<moduleNameHere>")) {
    # module is not loaded
}

또는 좀 더 간결하게 말하면:

if (!(Get-Module "<moduleNameHere>")) {
    # module is not loaded
}

현재 버전의 Powershell은 이 목적에 적합한 기능을 가지고 있습니다(혹은 적어도 제 경우에는 그렇습니다).

Get-InstalledModule

묘사

Get-InstalledModule.cmdlet은 PowerShell 모듈을 가져옵니다.

않는 경우 입니다.따라서 이 모듈에서는 "예외"를 설정해야 .따라서 이 모듈을 설정할 필요가 있습니다.ErrorAction그 사건을 진압하기 위해 적절한 조치를 취했습니다.

if ((Get-InstalledModule `
    -Name "AzureRm.Profile" `
    -MinimumVersion 5.0 ` # Optionally specify minimum version to have
    -ErrorAction SilentlyContinue) -eq $null) {

    # Install it...
}

.Get-InstalledModule

If (-not(Get-InstalledModule SomeModule -ErrorAction silentlycontinue)) {
  Write-Host "Module does not exist"
}
Else {
  Write-Host "Module exists"
}

방금 접한 문제이고 답변에 잘못된 내용이 있습니다(댓글에 기재되어 있습니다만).

그래도 첫 번째는.원래 질문에서는 PowerShell 모듈이 장착되어 있는지 확인하는 방법을 묻습니다.설치된 단어에 대해 이야기해야 합니다!PowerShell 모듈은 설치하지 않습니다(어차피 소프트웨어를 설치하는 기존 방식과는 다릅니다).

PowerShell 모듈은 사용할 수 있거나(즉, PowerShell 모듈 경로에 있음) Import되어 있습니다(세션으로 Import되어 포함된 함수를 호출할 수 있습니다).모듈 저장 위치를 알고 싶은 경우 모듈 경로를 확인하는 방법은 다음과 같습니다.

$env:psmodulepath

C:\Program Files\사용하는 것이 일반화되고 있다고 생각합니다.Windows PowerShell\Modules: 모든 사용자가 사용할 수 있기 때문에 더 자주 사용할 수 있지만 모듈을 자신의 세션에 잠그려면 해당 모듈을 프로파일에 포함하십시오.C:\Users%username%\문서\Windows PowerShell \ 모듈

자, 다시 두 주로 돌아가 봅시다.

모듈을 사용할 수 있습니까(원래 질문에 장착된 모듈을 사용할 수 있음)?

Get-Module -Listavailable -Name <modulename>

모듈을 Import할 수 있는지 여부를 나타냅니다.

모듈이 Import되었습니까?(원래 질문의 'exists'에 대한 답변으로 사용하고 있습니다).

Get-module -Name <modulename>

모듈이 Import되지 않은 경우 빈 부하가 반환되거나 Import된 경우 모듈에 대한 설명이 한 줄씩 표시됩니다.Stack Overflow에서와 마찬가지로 자신의 모듈에서 위의 명령어를 사용해 보십시오.

스크립트에서 기본 모듈이 아닌 모듈을 사용하는 경우 아래 함수를 호출합니다.모듈 이름 외에 최소 버전을 제공할 수 있습니다.

# See https://www.powershellgallery.com/ for module and version info
Function Install-ModuleIfNotInstalled(
    [string] [Parameter(Mandatory = $true)] $moduleName,
    [string] $minimalVersion
) {
    $module = Get-Module -Name $moduleName -ListAvailable |`
        Where-Object { $null -eq $minimalVersion -or $minimalVersion -lt $_.Version } |`
        Select-Object -Last 1
    if ($null -ne $module) {
         Write-Verbose ('Module {0} (v{1}) is available.' -f $moduleName, $module.Version)
    }
    else {
        Import-Module -Name 'PowershellGet'
        $installedModule = Get-InstalledModule -Name $moduleName -ErrorAction SilentlyContinue
        if ($null -ne $installedModule) {
            Write-Verbose ('Module [{0}] (v {1}) is installed.' -f $moduleName, $installedModule.Version)
        }
        if ($null -eq $installedModule -or ($null -ne $minimalVersion -and $installedModule.Version -lt $minimalVersion)) {
            Write-Verbose ('Module {0} min.vers {1}: not installed; check if nuget v2.8.5.201 or later is installed.' -f $moduleName, $minimalVersion)
            #First check if package provider NuGet is installed. Incase an older version is installed the required version is installed explicitly
            if ((Get-PackageProvider -Name NuGet -Force).Version -lt '2.8.5.201') {
                Write-Warning ('Module {0} min.vers {1}: Install nuget!' -f $moduleName, $minimalVersion)
                Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Scope CurrentUser -Force
            }        
            $optionalArgs = New-Object -TypeName Hashtable
            if ($null -ne $minimalVersion) {
                $optionalArgs['RequiredVersion'] = $minimalVersion
            }  
            Write-Warning ('Install module {0} (version [{1}]) within scope of the current user.' -f $moduleName, $minimalVersion)
            Install-Module -Name $moduleName @optionalArgs -Scope CurrentUser -Force -Verbose
        } 
    }
}

사용 예:

Install-ModuleIfNotInstalled 'CosmosDB' '2.1.3.528'

도움이 되는지 아닌지 알려주세요.

문을 사용할 수 있습니다(PowerShell 3.0 모듈 지원).

#Requires 문을 사용하면 PowerShell 버전, 모듈, 스냅인 및 모듈 및 스냅인 버전의 전제 조건을 충족하지 않는 한 스크립트가 실행되지 않습니다.

의 맨 ""를 추가합니다.#Requires -Module <ModuleName>

필요한 모듈이 현재 세션에 없는 경우 PowerShell이 해당 모듈을 가져옵니다.

모듈을 Import할 수 없는 경우 PowerShell에서 종료 오류가 발생합니다.

try {
    Import-Module SomeModule
    Write-Host "Module exists"
} 
catch {
    Write-Host "Module does not exist"
}

cmdlet cmdlet이 라는 점에 유의해야 .Import-Module에는 종료 에러가 없기 때문에 예외가 검출되지 않습니다.따라서 catch 스테이트먼트에 관계없이 작성한 새로운 스테이트먼트는 반환되지 않습니다.

(https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_try_catch_finally?view=powershell-6

위의 내용부터:

"종료 오류가 발생하면 문이 실행되지 않습니다.PowerShell이 종료 오류를 처리하지 않으면 현재 파이프라인을 사용한 함수 또는 스크립트 실행도 중지됩니다.C# 등 다른 언어에서는 종료 오류를 예외라고 합니다.오류에 대한 자세한 내용은 about_Errors를 참조하십시오."

다음과 같이 기재해야 합니다.

Try {
    Import-Module SomeModule -Force -Erroraction stop
    Write-Host "yep"
}
Catch {
    Write-Host "nope"
}

반환되는 내용:

nope

정말 다른 권장 .Get-Module -ListAvailable -Name ★★★★★★★★★★★★★★★★★」Get-Module -Name다른 기능/기능을 실행하기 전에 각별히 주의해야 합니다. PS를 할 .Find-Modulecmdlet을 클릭하여 사용 가능한 새 버전이 있는지 확인합니다.

IMHO, 모듈이 다음 상태인지 확인하는 것은 다릅니다.

1) 설치 또는 2) Import:

인스톨 되어 있는지를 확인하려면:

옵션 1: 사용Get-Module와 함께-ListAvailable파라미터:

If(Get-Module -ListAvailable -Name "<ModuleName>"){'Module is installed'}
Else{'Module is NOT installed'}

옵션 2: 사용$error오브젝트:

$error.clear()
Import-Module "<ModuleName>" -ErrorAction SilentlyContinue
If($error){Write-Host 'Module is NOT installed'}
Else{Write-Host 'Module is installed'}

Import 여부를 확인하려면:

사용.Get-Module와 함께-Name파라미터(기본값이므로 생략할 수 있습니다):

if ((Get-Module -Name "<ModuleName>")) {
   Write-Host "Module is already imported (i.e. its cmdlets are available to be used.)"
}
else {
   Write-Warning "Module is NOT imported (must be installed before importing)."
}

Linux 배경에서 작성되었습니다.GREP와 같은 것을 사용하는 것을 선호하기 때문에 Select-String을 사용합니다.그래서 어떤 사람이 완전한 모듈 이름을 모를지라도.이니셜을 입력하여 모듈의 존재 여부를 판별할 수 있습니다.

Get-Module -ListAvailable -All | Select-String Module_Name(모듈 이름의 일부일 수 있음)

답변이 너무 많아서 여러 개의 댓글이 아닌 별도의 답변으로 게시합니다.이것은 공익방송이라고 생각해 주세요.

사용방법에 근거한 답변Get-InstalledModule모듈을 사용할 수 있는지 알고 싶다면 매우 위험합니다.PowerShell인스톨 합니다. Get-InstalledModule는 PowerShellGet에서 모듈이 설치되어 있는 경우에만 모듈의 존재를 보고합니다.

PowerShell의 증거:

PS C:\Users\chris> Get-InstalledModule | Select-Object -Property Name, Version

Name         Version
----         -------
Choco        1.0.0
NTFSSecurity 4.2.6

PS C:\Users\chris> Get-Module | Select-Object -Property Name, Version

Name                            Version
----                            -------
chocolateyProfile               0.0
CimCmdlets                      7.0.0.0
Microsoft.PowerShell.Management 7.0.0.0
Microsoft.PowerShell.Security   7.0.0.0
Microsoft.PowerShell.Utility    7.0.0.0
Microsoft.WSMan.Management      7.0.0.0
PackageManagement               1.4.7
PowerShellGet                   2.2.5
PSReadLine                      2.1.0

에 대한 파라미터는 없습니다.Get-InstalledModule이 명령어를 사용하여 "현재 표시되지 않는 다른 모듈을 표시"할 수 있습니다.다른 것은 표시할 수 없습니다.위에서 볼 수 있듯이 세션에 9개의 모듈을 Import 했을 때 설치된 모듈은 2개뿐입니다.

답변이므로 여기에 추천을 추가합니다.

  • @Kiemen Shindler의 답변(https://stackoverflow.com/a/28740512/1236579)이 좋다.다른 사람들이 지적한 바와 같이-ListAvailable파라미터는 실제로 사용 가능한 모든 모듈을 나열하는 것은 아닙니다.하지만 사실 우리 대부분은 별로 신경 쓰지 않을 거예요 왜냐하면ListAvailable모듈을 반환하지 않기 때문에 비표준/수동 방식을 사용하여 모듈을 로드하는 방법을 알고 있지 않으면 모듈을 사용할 수 없습니다.이 경우 처음부터 모듈을 검색할 필요가 없습니다.
  • 그 이상의 것이 필요한 경우는, @TJ Galama 와 @Rod 모두, 우선 좋은 스크립트를 제공하고 있다고 생각합니다.

그래서 내가 말했듯이, 나의 가장 좋은 대답은 다른 사람의 답을 읽는 것이지만, 제발 이 페이지를 떠나서는 안 된다.Get-InstalledModule는 PowerShell 설치에 모듈이 설치되어 있는지(로컬 Import 가능) 여부를 확인하는 신뢰성 높은 방법입니다.그건 그냥 용도가 아니야.PowerShell Get에 의해 설치된 모듈의 이름은 제공되지만 로컬에 설치된 다른 모듈의 이름은 제공하지 않습니다.

  • 모듈이 로딩되어 있는지 먼저 테스트합니다.
  • 그럼 Import

```

if (Get-Module -ListAvailable -Name <<MODULE_NAME>>) {
    Write-Verbose -Message "<<MODULE_NAME>> Module does not exist." -Verbose
}
if (!(Get-Module -Name <<MODULE_NAME>>)) {
    Get-Module -ListAvailable <<MODULE_NAME>> | Import-Module | Out-Null
}

```

다음은 AZ 모듈이 장착되어 있는지 여부를 확인하는 코드입니다.

$checkModule = "AZ"

$Installedmodules = Get-InstalledModule

if ($Installedmodules.name -contains $checkModule)
{

    "$checkModule is installed "

}

else {

    "$checkModule is not installed"

}

if-else를 사용한 이 없는 :Az이데올로기 때문에

Get-InstalledModule Az

이 기능은 셸 콘솔에서 작업 중 PowerShell 모듈이 설치되어 있는지 확인하려는 경우에 필요합니다.

Test-Path "C:\Program Files\WindowsPowerShell\Modules\ModuleName"

모듈 이름과 일반적인 설치 경로를 알고 있는 경우 다음을 사용할 수 있습니다.

$a = New-Object -TypeName 'System.Collections.ArrayList'

$paths = "$env:userprofile\*\ModuleName","C:\Program 
Files\WindowsPowerShell\Modules\ModuleName"

foreach ($path in $paths)
{
   $a.add($(Test-path $path))
}

If ($a -contains $true)
{
    Write-Host "ModuleName is installed" -ForegroundColor Green
}
else
{
    Write-Host "ModuleName is not installed" -foregroundcolor Red
}

오해하지 마세요.Get-module - list Available | {$.name -eq "ModuleName"}은(는) 매우 잘 작동합니다.여러 모듈이 설치되어 있으면 시간이 너무 오래 걸립니다.

언급URL : https://stackoverflow.com/questions/28740320/how-do-i-check-if-a-powershell-module-is-installed

반응형