পাওয়ারশেল মডিউল ইনস্টল করা আছে কিনা তা আমি কীভাবে পরীক্ষা করব?


92

কোনও মডিউল বিদ্যমান কিনা তা পরীক্ষা করতে আমি নিম্নলিখিতটি চেষ্টা করেছি:

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এটি বিদ্যমান নেই।

সিস্টেমে পাওয়ারশেল মডিউল ইনস্টল করা আছে কিনা তা সনাক্ত করার জন্য কি কোনও ভাল উপায় (পছন্দসই ত্রুটি উত্পন্ন না করে) রয়েছে?


উত্তর:


119

আপনি এর ListAvailableবিকল্পটি ব্যবহার করতে পারেন Get-Module:

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

4
আমি সুগারেটে যাচ্ছিলাম: আমদানি-মডিউল অ্যান্টিস্টেস্টিং মডিউল-এরর অ্যাকশন সাইলেন্টলি কনটিনিউ IF ($ ত্রুটি) {লিখুন-হোস্ট 'মডিউলটির অস্তিত্ব নেই'} ELSE {লিখিত-হোস্টের 'মডিউলটি বিদ্যমান' 'তবে আপনার উপায়টি আরও ভাল, আরও মার্জিত :)
এরিক ব্লুমগ্রেন

এটি দুর্দান্ত কাজ করে। ধন্যবাদ আমি ব্যবহার করব Write-Warning "Module does not exist..." ;Breakতবে আপনি সমস্ত কঠোর পরিশ্রম করেছেন।
ক্রেগ.সি

আপনি যদি গ্রন্থাগারগুলি Import-Moduleএবং একটি কাস্টম dll ফাইল ব্যবহার করে আমদানি করে -ListAvailableথাকেন তবে মডিউলটি ইনস্টল করা হয়েছে কিনা তা নির্ধারণের জন্য বিকল্পটি ব্যবহার করবেন না কারণ এটি তালিকাভুক্ত হবে না। পাওয়ারশেল 6 ডকুমেন্টেশন অনুসারে , "তালিকায় থাকা উপলব্ধ মডিউলগুলি বর্তমান সেশনে লোড করা হলেও, PSModulePath এনভায়রনমেন্ট ভেরিয়েবলের মধ্যে পাওয়া যায় না এমন মডিউলগুলি সম্পর্কে তথ্য ফেরত দেয় না"।
ডেভ এফ

এটি নির্ধারণ করে না যে কোনও মডিউল ইনস্টল করা হয়েছে কিনা (যেমন Import-Module) এটি নির্ধারণ করে যে মডিউলটি ইনস্টল করার জন্য তত্ক্ষণাত্ সুনির্দিষ্ট অবস্থান নির্দিষ্ট না করে ইনস্টল করার জন্য তাৎক্ষণিকভাবে পাওয়া যায় কিনা$env:PSModulePath
স্লোগমিস্টার এক্সট্রার্ডাইনায়ার

35

তালিকাল উপলভ্য বিকল্পটি আমার পক্ষে কাজ করে না। পরিবর্তে এটি করে:

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

বা, আরও সংহত হতে:

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

@ oɔɯǝɹ আমি ভেবেছিলাম -লিস্টআলভ্যালিটি কেবল সহজলভ্য নয় তবে আমি তখনও আমদানি-মডিউল চেষ্টা করছি। গেট-মডিউলটি দিয়ে এটি ঠিক আছে
ক্রেগ.সি

4
আপনি পরীক্ষা করে দেখুন যে মডিউলটি লোডড (যা নিজে নিজেই কার্যকর - systemcentercentral.com/… ) তবে মডিউলটি উপস্থিত থাকলে অন্য উত্তর চেক করে না।
মাইকেল ফ্রিজিম

4
এটি listAv উপলভ্য ব্যবহারের চেয়ে অনেক দ্রুত সম্পাদন করে।
গাটেক থমাস

মোটামুটি নিশ্চিত !যে সংস্করণটির উপর নির্ভর করে পাওয়ারশেলে কাজ করে না?
কলব ক্যানিয়ন

4
@ কলবক্যানিয়ন !একটি উপনাম -not, তবে আমি পিএস 1 স্ক্রিপ্টগুলিতে সাধারণভাবে এলিয়াস ব্যবহার করার পরামর্শ দেব না। @ গ্যাচটথ থমাসের এটির একটি আলাদা আচরণ রয়েছে, যেমনটি @ মিচেলফ্রেজিম দ্বারা নির্দিষ্ট করা হয়েছে (এটি ইনস্টলড, তবে আমদানি করা হয়নি, মডিউলগুলির সত্যতা মান দেয় না)।
অ্যান্ড্রেসহাসিং

27

একটি মডিউল নিম্নলিখিত রাজ্যে হতে পারে:

  • আমদানিকৃত
  • ডিস্কে উপলব্ধ (বা স্থানীয় নেটওয়ার্ক)
  • অনলাইন গ্যালারী উপলব্ধ

আপনি যদি কেবল পাওয়ার শেল সেশনে ব্যবহারের জন্য ডার্ন জিনিসটি উপলব্ধ করতে চান তবে এখানে এমন একটি ফাংশন রয়েছে যা এটি করবে বা এটি সম্পন্ন করতে না পারলে বাইরে বেরিয়ে যাবে:

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 module is not imported, not available and not in online gallery then abort
                write-host "Module $m not imported, not available and not in online gallery, exiting."
                EXIT 1
            }
        }
    }
}

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

4
এটি দুর্দান্ত "অল-ইন-ওয়ান" সমাধান (আমি কেবল এক্সিডের পরিবর্তে লোড-মডিউলটি $ সত্য / $ প্রত্যাবর্তনের জন্য পরিবর্তন করেছি)
আন্দ্রেজ মার্টিনা

17

পাওয়ারশেলের বর্তমান সংস্করণে একটি Get-InstalledModuleফাংশন রয়েছে যা এই উদ্দেশ্যটির জন্য ভালভাবে স্যুট করে (বা কমপক্ষে এটি আমার ক্ষেত্রে হয়েছিল)।

Get-InstalledModule

বর্ণনা

Get-InstalledModuleCmdlet PowerShell মডিউল যা একটি কম্পিউটারে ইনস্টল করা পায়।

এটির সাথে একমাত্র ইস্যুটি হ'ল এটি অনুরোধ করা হচ্ছে যে মডিউলটি বিদ্যমান না থাকলে এটি একটি ব্যতিক্রম ছুঁড়ে দেয়, সুতরাং আমাদের ErrorActionকেসটি দমন করার জন্য উপযুক্তভাবে সেট করা দরকার ।

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

    # Install it...
}

13

এটি কেবলমাত্র আমার মুখোমুখি হওয়া বিষয় হিসাবে এটি পুনর্বিবেচনা করছে এবং উত্তরে কিছু ভুল জিনিস রয়েছে (যদিও এটি মন্তব্যে উল্লিখিত হয়েছে)।

প্রথম জিনিস যদিও। মূল প্রশ্নগুলি জিজ্ঞাসা করে যে কীভাবে পাওয়ারশেল মডিউল ইনস্টল করা আছে তা বলবেন। আমাদের ইনস্টলড শব্দটির কথা বলতে হবে! আপনি পাওয়ারশেল মডিউলগুলি ইনস্টল করবেন না (কোনওভাবেই আপনি সফ্টওয়্যার ইনস্টল করার প্রচলিত পদ্ধতিতে নয়)।

পাওয়ারশেল মডিউলগুলি হয় উপলব্ধ (যেমন তারা পাওয়ারশেল মডিউল পথে রয়েছে), বা সেগুলি আমদানি করা হয় (সেগুলি আপনার সেশনে আমদানি করা হয় এবং আপনি এতে থাকা ক্রিয়াকলাপগুলিতে কল করতে পারেন)। আপনার মডিউলটির পথটি কীভাবে পরীক্ষা করতে হবে, আপনি যদি কোনও মডিউল কোথায় সংরক্ষণ করবেন তা জানতে চাইলে:

$env:psmodulepath

আমি যুক্তি দিয়ে বলছি যে এটি সি: \ প্রোগ্রাম ফাইলগুলি \ উইন্ডোজপাওয়ারশেল \ মডিউলগুলি ব্যবহার করা সাধারণ হয়ে উঠছে ; এটি প্রায়শই সমস্ত ব্যবহারকারীর কাছে উপলব্ধ থাকার কারণে, তবে আপনি যদি নিজের মডিউলগুলি আপনার নিজের সেশনে লক করতে চান তবে সেগুলি আপনার প্রোফাইলে অন্তর্ভুক্ত করুন। সি: \ ব্যবহারকারী \% ব্যবহারকারীর নাম% \ ডকুমেন্টস \ উইন্ডোজপাওয়ারশেল \ মডিউলগুলি;

ঠিক আছে, দুটি রাজ্যে ফিরে।

মডিউলটি কি উপলব্ধ (মূল প্রশ্নে ইনস্টল করার অর্থ ব্যবহার করে)?

Get-Module -Listavailable -Name <modulename>

এটি আপনাকে জানায় যে আমদানির জন্য কোনও মডিউল উপলব্ধ।

মডিউলটি কি আমদানি করা হয়? (আমি এটিকে মূল প্রশ্নের 'উপস্থিতি' শব্দের উত্তর হিসাবে ব্যবহার করছি)

Get-module -Name <modulename>

এটি হয় মডিউলটি আমদানি না করা হলে কোনও কিছুই খালি লোড বা মডিউলটির যদি এক লাইনের বিবরণ দেয় তবে তা ফিরিয়ে আনবে। ওভারফ্লোতে স্ট্যাকের মতো, নিজের মডিউলগুলিতে উপরের কমান্ডগুলি ব্যবহার করে দেখুন।


4
আপনি পাওয়ারশেলে মডিউল ইনস্টল করতে পারেন। পাওয়ারশেলগেটের কমান্ড রয়েছে Get-InstalledModuleযা একই আউটপুটটি ফিরিয়ে দিচ্ছে নাGet-Module -ListAvailable
ইগোর

9

আমি যখন আমার স্ক্রিপ্টগুলিতে একটি অ-ডিফল্ট মডিউল ব্যবহার করি তখন আমি নীচে ফাংশনটি কল করি। মডিউল নামের পাশে আপনি ন্যূনতম সংস্করণ সরবরাহ করতে পারেন।

# 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 -ge $_.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'

এটি দরকারী যদি না আমাকে জানাবেন (বা না)


4

আপনি #Requiresবিবৃতিটি ব্যবহার করতে পারেন (পাওয়ারশেল 3.0 থেকে মডিউলগুলি সমর্থন করে)।

পাওয়ারশেল সংস্করণ, মডিউল, স্ন্যাপ-ইনস, এবং মডিউল এবং স্ন্যাপ-ইন সংস্করণ পূর্বশর্তগুলি পূরণ না করা হলে #Requires স্টেটমেন্টটি স্ক্রিপ্টটি চলতে বাধা দেয়।

সুতরাং স্ক্রিপ্টের শীর্ষে, কেবল যুক্ত করুন #Requires -Module <ModuleName>

যদি প্রয়োজনীয় মডিউলগুলি বর্তমান সেশনে না থাকে তবে পাওয়ারশেল সেগুলি আমদানি করে।

যদি মডিউলগুলি আমদানি করা যায় না, পাওয়ারশেল একটি সমাপ্তি ত্রুটি ছুড়ে দেয়।


3

আইএমএইচও, কোনও মডিউল কিনা তা যাচাই করার মধ্যে পার্থক্য রয়েছে:

1) ইনস্টল করা, বা 2) আমদানি করা:

ইনস্টল করা হয়েছে কিনা তা পরীক্ষা করতে:

বিকল্প 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'}

আমদানি করা হয়েছে কিনা তা পরীক্ষা করতে:

ব্যবহার 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)."
}

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

এটি উল্লেখ করা উচিত যে আপনার সেমিডলেটটিতে Import-Moduleকোনও সমাপ্তি ত্রুটি নেই, সুতরাং ব্যতিক্রম ধরা পড়ছে না তাই আপনার ক্যাচ স্টেটমেন্টটি আপনার লেখা নতুন বিবৃতিটি কখনই ফিরিয়ে দেবে না তা বিবেচনা করুন।

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

ওপর থেকে:

"একটি সমাপ্তি ত্রুটিটি স্টেটমেন্টটি চলমান থেকে থামায় Power । ত্রুটি সম্পর্কে আরও তথ্যের জন্য, সম্পর্কে_আরক্ষকগুলি দেখুন ""

এটি হিসাবে লেখা উচিত:

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

যা ফেরত:

nope

এবং যদি আপনি সত্যিই পুরোপুরি হতে চেয়েছিলেন তবে অন্যান্য ফাংশন / সেন্টিমিলেট চালানোর আগে আপনাকে অন্য প্রস্তাবিত সেমিডলেটগুলিতে যোগ করা Get-Module -ListAvailable -Nameএবং Get-Module -Nameঅতিরিক্ত সতর্কতা অবলম্বন করা উচিত। এবং এটি যদি স্যাজালারি থেকে বা অন্য কোথাও ইনস্টল করা থাকে তবে আপনি Find-Moduleকোনও নতুন সংস্করণ উপলব্ধ কিনা তা দেখতে আপনি একটি সেমিডলেটও চালাতে পারেন।


2

আপনি ব্যবহার করতে পারেন Get-InstalledModule

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

এখানে অনেক ভাল উত্তর, তবে এই নতুন সহজ পদ্ধতির সাহায্যে এটি সম্ভবত নতুন গৃহীত উত্তর হওয়া উচিত।
not2qubit

1
  • মডিউলটি লোড হলে প্রথমে পরীক্ষা করুন
  • তারপরে আমদানি করুন

`` `

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
}

`` `


1

লিনাক্স ব্যাকগ্রাউন্ড থেকে আসছে। আমি গ্রিপের অনুরূপ কিছু ব্যবহার করতে পছন্দ করব, তাই আমি নির্বাচন-স্ট্রিং ব্যবহার করি। সুতরাং কেউ সম্পূর্ণ মডিউল নাম সম্পর্কে নিশ্চিত না হলেও। তারা আদ্যক্ষর সরবরাহ করতে পারে এবং মডিউলটি বিদ্যমান কিনা তা নির্ধারণ করতে পারে।

Get-Module -ListAvailable -All | Select-String Module_Name(মডিউল নামের একটি অংশ হতে পারে)


1

এজেড মডিউলটি ইনস্টল হয়েছে কিনা তা যাচাই করার জন্য এখানে কোডটি রয়েছে:

$checkModule = "AZ"

$Installedmodules = Get-InstalledModule

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

    "$checkModule is installed "

}

else {

    "$checkModule is not installed"

}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.