PowerShell मॉड्यूल स्थापित होने पर मैं कैसे जांच करूं?


97

यह जाँचने के लिए कि क्या कोई मॉड्यूल मौजूद है, मैंने निम्नलिखित कोशिश की है:

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 मॉड्यूल सिस्टम पर स्थापित है?


जवाबों:


126

आप के ListAvailableविकल्प का उपयोग कर सकते हैं Get-Module:

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


यह बहुत अच्छा काम करता है। धन्यवाद। मैं उपयोग करूँगा Write-Warning "Module does not exist..." ;Breakलेकिन आपने पूरी मेहनत की है।
क्रेग। C

यदि आप पुस्तकालयों का उपयोग कर Import-Moduleऔर एक कस्टम dll फ़ाइल आयात कर रहे हैं , तो यह -ListAvailableनिर्धारित करने के लिए कि मॉड्यूल सूचीबद्ध नहीं है, यह निर्धारित करने के लिए विकल्प का उपयोग न करें । PowerShell 6 प्रलेखन के अनुसार , "ListAvailable उन मॉड्यूल के बारे में जानकारी नहीं देता है जो PSModulePath पर्यावरण चर में नहीं पाए जाते हैं, भले ही वे मॉड्यूल वर्तमान सत्र में लोड किए गए हों"।
डेव एफ

यह निर्धारित नहीं करता है कि क्या मॉड्यूल स्थापित किया गया है (यानी Import-Module) यह केवल यह निर्धारित करता है कि मॉड्यूल तुरंत उपलब्ध होने के लिए बिना किसी विशिष्ट स्थान को निर्दिष्ट किए बिना उपलब्ध है$env:PSModulePath
स्लोगमिस्टर एक्स्ट्राऑर्डिनेयर

34

ListAvailable विकल्प मेरे लिए काम नहीं करता है। इसके बजाय यह करता है:

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

या, अधिक रसीला होने के लिए:

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

@ o @ मैंने सोचा था कि -ListAvailable बस उपलब्ध नहीं था, लेकिन मैं अभी भी आयात-मॉड्यूल की कोशिश कर रहा था। Get-Module के साथ यह ठीक है
Craig.C

3
यदि आप जाँच करते हैं कि मॉड्यूल LOADED (जो स्वयं उपयोगी है - systemcentercentral.com/… ), लेकिन मॉड्यूल मौजूद होने पर अन्य उत्तर की जाँच नहीं करता है।
माइकल फ्रीजिम

1
यह ListAvailable का उपयोग करने की तुलना में बहुत तेज़ी से निष्पादित होता है।
GaTechThomas

निश्चित रूप से निश्चित रूप !से संस्करण के आधार पर शक्तियों में काम नहीं करता है?
कोलोब कैन्यन

2
@KolobCanyon के !लिए एक उपनाम है -not, लेकिन मैं सामान्य रूप में ps1 लिपियों में उपनाम का उपयोग करने की सिफारिश नहीं करूंगा। @GaTechThomas में इसका एक अलग व्यवहार भी है, जैसा कि @MichaelFreidgeim द्वारा निर्दिष्ट है (यह स्थापित के लिए एक सत्य मान नहीं लौटाता है, लेकिन आयातित नहीं है, मॉड्यूल)।
एंड्रियाशेसिंग

28

एक मॉड्यूल निम्नलिखित राज्यों में हो सकता है:

  • आयातित
  • डिस्क पर उपलब्ध (या स्थानीय नेटवर्क)
  • ऑनलाइन गैलरी में उपलब्ध है

यदि आप उपयोग के लिए पॉवरशेल सत्र में केवल 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 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

1
यह महान "ऑल-इन-वन" समाधान है (मैंने केवल EXIT के बजाय $ true / $ false लौटने के लिए Load-Module को बदल दिया है)
Andrzej Martyna

ये सुन्दर है।
शॉन

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

जैसा कि मैंने अभी-अभी इसका सामना किया है और जवाबों में कुछ गलत सामग्री है (हालाँकि यह टिप्पणियों में उल्लिखित है) के रूप में इसे फिर से देखना।

पहली बात हालांकि। मूल प्रश्न पूछते हैं कि कैसे बताया जाए कि पावरशेल मॉड्यूल स्थापित है या नहीं। हमें स्थापित शब्द के बारे में बात करने की आवश्यकता है! आप PowerShell मॉड्यूल स्थापित नहीं करते (वैसे भी आप सॉफ्टवेयर स्थापित करने के पारंपरिक तरीके से नहीं)।

PowerShell मॉड्यूल या तो उपलब्ध हैं (यानी वे PowerShell मॉड्यूल पथ पर हैं), या वे आयात किए गए हैं (वे आपके सत्र में आयात किए जाते हैं और आप निहित फ़ंक्शन को कॉल कर सकते हैं)। यह है कि आप अपने मॉड्यूल पथ की जाँच कैसे करें, यदि आप जानना चाहते हैं कि मॉड्यूल को कहाँ संग्रहीत करना है:

$env:psmodulepath

मेरा तर्क है कि C: \ Program Files \ WindowsPowerShell \ Modules का उपयोग करना आम हो रहा है ; अधिक बार होने के कारण यह सभी उपयोगकर्ताओं के लिए उपलब्ध है, लेकिन अगर आप अपने मॉड्यूल को अपने सत्र में लॉक करना चाहते हैं, तो उन्हें अपनी प्रोफ़ाइल में शामिल करें। C: \ Users \% उपयोगकर्ता नाम% \ दस्तावेज़ \ WindowsPowerShell \ मॉड्यूल;

ठीक है, दो राज्यों में वापस।

क्या मॉड्यूल उपलब्ध है (मूल प्रश्न में स्थापित माध्य का उपयोग करके)?

Get-Module -Listavailable -Name <modulename>

यह आपको बताता है कि क्या कोई मॉड्यूल आयात के लिए उपलब्ध है।

क्या मॉड्यूल आयात किया जाता है? (मैं मूल प्रश्न में 'अस्तित्व' शब्द के उत्तर के रूप में इसका उपयोग कर रहा हूं)।

Get-module -Name <modulename>

यदि मॉड्यूल आयात नहीं किया गया है, या यह मॉड्यूल का एक पंक्ति विवरण है, तो यह या तो कुछ भी नहीं का एक खाली भार लौटाएगा। स्टैक ओवरफ्लो पर हमेशा की तरह, अपने स्वयं के मॉड्यूल पर ऊपर दिए गए आदेशों का प्रयास करें।


1
आप PowerShell में मॉड्यूल स्थापित कर सकते हैं। PowerShellGet में कमांड है 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कथन का उपयोग कर सकते हैं (PowerShell 3.0 से मॉड्यूल का समर्थन करता है)।

जब तक PowerShell संस्करण, मॉड्यूल, स्नैप-इन्स और मॉड्यूल और स्नैप-इन संस्करण पूर्वापेक्षाएँ पूरी नहीं होती हैं, तब तक #Requires कथन स्क्रिप्ट को चलाने से रोकता है।

इसलिए स्क्रिप्ट के शीर्ष पर, बस जोड़ें #Requires -Module <ModuleName>

यदि आवश्यक मॉड्यूल वर्तमान सत्र में नहीं हैं, तो PowerShell उन्हें आयात करता है।

यदि मॉड्यूल आयात नहीं किया जा सकता है, तो PowerShell एक समाप्ति त्रुटि फेंकता है।


3

IMHO, जाँच के बीच अंतर है कि क्या एक मॉड्यूल है:

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

यह बताया जाना चाहिए कि आपके cmdlet Import-Moduleमें कोई समाप्ति त्रुटि नहीं है, इसलिए अपवाद को पकड़ा नहीं जा रहा है, इसलिए कोई फर्क नहीं पड़ता कि आपका कैच स्टेटमेंट आपके द्वारा लिखे गए नए कथन को कभी वापस नहीं करेगा।

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

ऊपर में से:

"एक समाप्ति त्रुटि चलने से एक कथन को रोकती है। यदि PowerShell किसी तरह से एक त्रुटि को समाप्त नहीं करता है, तो PowerShell वर्तमान पाइपलाइन का उपयोग करके फ़ंक्शन या स्क्रिप्ट को चलाना बंद कर देता है। अन्य भाषाओं में, जैसे C #, समाप्ति त्रुटियों को अपवाद के रूप में संदर्भित किया जाता है। त्रुटियों के बारे में अधिक जानकारी के लिए, about_Errors देखें। "

इसे इस प्रकार लिखा जाना चाहिए:

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

कौन सा रिटर्न:

nope

और यदि आप वास्तव में पूरी तरह से बनना चाहते हैं, तो आपको अन्य कार्यों / cmdlets को चलाने से पहले अन्य सुझाए गए cmdlets में जोड़ना चाहिए Get-Module -ListAvailable -Nameऔर Get-Module -Nameअतिरिक्त सतर्क रहना चाहिए। और अगर इसका ps psallery या कहीं और से स्थापित किया गया है तो आप यह Find-Moduleदेखने के लिए एक cmdlet भी चला सकते हैं कि क्या कोई नया संस्करण उपलब्ध है।


3

आप उपयोग कर सकते हैं 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

लिनक्स पृष्ठभूमि से आ रहा है। मैं grep के समान कुछ का उपयोग करना पसंद करूंगा, इसलिए मैं Select-String का उपयोग करता हूं। यहां तक ​​कि अगर किसी को पूरा मॉड्यूल नाम का यकीन नहीं है। वे प्रारंभिक प्रदान कर सकते हैं और निर्धारित कर सकते हैं कि मॉड्यूल मौजूद है या नहीं।

Get-Module -ListAvailable -All | Select-String Module_Name(मॉड्यूल नाम का एक हिस्सा हो सकता है)


1

यह जाँचने के लिए कोड है कि क्या AZ मॉड्यूल स्थापित है या नहीं:

$checkModule = "AZ"

$Installedmodules = Get-InstalledModule

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

    "$checkModule is installed "

}

else {

    "$checkModule is not installed"

}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.