Untuk memeriksa apakah ada modul, saya telah mencoba yang berikut ini:
try {
Import-Module SomeModule
Write-Host "Module exists"
}
catch {
Write-Host "Module does not exist"
}
Outputnya adalah:
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
Saya mendapatkan kesalahan, tetapi tidak terkecuali dilempar, jadi kita lihat Module exists
pada akhirnya, meskipun SomeModule
tidak ada.
Apakah ada cara yang baik (lebih disukai tanpa menimbulkan kesalahan) untuk mendeteksi jika modul PowerShell diinstal pada sistem?
powershell
Klemens Schindler
sumber
sumber
Jawaban:
Anda dapat menggunakan
ListAvailable
opsiGet-Module
:if (Get-Module -ListAvailable -Name SomeModule) { Write-Host "Module exists" } else { Write-Host "Module does not exist" }
sumber
Write-Warning "Module does not exist..." ;Break
Tapi Anda telah melakukan semua kerja keras.Import-Module
dan file dll kustom, jangan gunakan-ListAvailable
opsi untuk menentukan apakah modul diinstal karena tidak akan terdaftar. Menurut dokumentasi PowerShell 6 , "ListAvailable tidak mengembalikan informasi tentang modul yang tidak ditemukan di variabel lingkungan PSModulePath, bahkan jika modul tersebut dimuat di sesi saat ini".Import-Module
) itu hanya menentukan apakah modul segera tersedia untuk diinstal tanpa menentukan lokasi tertentu yang belum ada di$env:PSModulePath
Opsi ListAvailable tidak berfungsi untuk saya. Sebaliknya ini:
if (-not (Get-Module -Name "<moduleNameHere>")) { # module is not loaded }
Atau, lebih singkatnya:
if (!(Get-Module "<moduleNameHere>")) { # module is not loaded }
sumber
!
tidak berfungsi di PowerShell tergantung pada versinya?!
adalah alias untuk-not
, tetapi saya tidak akan merekomendasikan penggunaan alias dalam skrip ps1 secara umum. @GaTechThomas juga memiliki perilaku yang berbeda, seperti yang ditentukan oleh @MichaelFreidgeim (tidak mengembalikan nilai yang sebenarnya untuk modul yang diinstal, tetapi tidak diimpor).Sebuah modul bisa berada dalam status berikut:
Jika Anda hanya ingin hal terkutuk tersedia dalam sesi PowerShell untuk digunakan, berikut adalah fungsi yang akan melakukannya atau keluar jika tidak dapat menyelesaikannya:
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
sumber
Versi Powershell saat ini memiliki
Get-InstalledModule
fungsi yang sesuai dengan tujuan ini dengan baik (atau setidaknya dalam kasus saya).Satu-satunya masalah dengan itu adalah ia melontarkan pengecualian jika modul yang diminta tidak ada, jadi kita perlu menyetel dengan
ErrorAction
tepat untuk menekan kasus itu.if ((Get-InstalledModule ` -Name "AzureRm.Profile" ` -MinimumVersion 5.0 ` # Optionally specify minimum version to have -ErrorAction SilentlyContinue) -eq $null) { # Install it... }
sumber
Hanya meninjau kembali ini karena itu adalah sesuatu yang baru saja saya hadapi dan ada beberapa hal yang salah dalam jawaban (meskipun disebutkan di komentar).
Hal pertama. Pertanyaan asli menanyakan bagaimana cara mengetahui apakah modul PowerShell diinstal. Kita perlu berbicara tentang kata terpasang! Anda tidak menginstal modul PowerShell (tidak dengan cara tradisional Anda menginstal perangkat lunak).
Modul PowerShell tersedia (yaitu mereka berada di jalur modul PowerShell), atau diimpor (mereka diimpor ke sesi Anda dan Anda dapat memanggil fungsi yang ada). Ini adalah cara memeriksa jalur modul Anda, jika Anda ingin tahu di mana menyimpan modul:
$env:psmodulepath
Saya berpendapat bahwa itu menjadi umum untuk menggunakan C: \ Program Files \ WindowsPowerShell \ Modules; lebih sering karena itu tersedia untuk semua pengguna, tetapi jika Anda ingin mengunci modul Anda ke sesi Anda sendiri, sertakan mereka di profil Anda. C: \ Users \% username% \ Documents \ WindowsPowerShell \ Modules;
Baiklah, kembali ke dua negara bagian.
Apakah modul tersedia (menggunakan kata tersedia untuk dipasang di pertanyaan asli)?
Ini memberi tahu Anda jika modul tersedia untuk diimpor.
Apakah modul diimpor? (Saya menggunakan ini sebagai jawaban untuk kata 'ada' dalam pertanyaan aslinya).
Ini akan mengembalikan beban kosong dari apa-apa jika modul tidak diimpor, atau deskripsi satu baris dari modul jika itu. Seperti biasa di Stack Overflow, coba perintah di atas pada modul Anda sendiri.
sumber
Get-InstalledModule
yang tidak mengembalikan keluaran yang sama sepertiGet-Module -ListAvailable
Ketika saya menggunakan modul non-default dalam skrip saya, saya memanggil fungsi di bawah ini. Selain nama modul, Anda dapat memberikan versi minimum.
# 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 } } }
contoh penggunaan:
Install-ModuleIfNotInstalled 'CosmosDB' '2.1.3.528'
Tolong beri tahu saya jika itu berguna (atau tidak)
sumber
Anda dapat menggunakan
#Requires
pernyataan (mendukung modul dari PowerShell 3.0).Jadi Di bagian atas skrip, cukup tambahkan
#Requires -Module <ModuleName>
sumber
IMHO, ada perbedaan antara memeriksa apakah suatu modul:
1) dipasang, atau 2) diimpor:
Untuk memeriksa apakah sudah terpasang:
Opsi 1: Menggunakan
Get-Module
dengan-ListAvailable
parameter:If(Get-Module -ListAvailable -Name "<ModuleName>"){'Module is installed'} Else{'Module is NOT installed'}
Opsi 2: Menggunakan
$error
objek:$error.clear() Import-Module "<ModuleName>" -ErrorAction SilentlyContinue If($error){Write-Host 'Module is NOT installed'} Else{Write-Host 'Module is installed'}
Untuk memeriksa apakah diimpor:
Menggunakan
Get-Module
with-Name
parameter (yang dapat Anda hilangkan karena defaultnya ):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)." }
sumber
try { Import-Module SomeModule Write-Host "Module exists" } catch { Write-Host "Module does not exist" }
Ini harus ditunjukkan bahwa cmdlet Anda
Import-Module
tidak memiliki kesalahan penghentian, oleh karena itu pengecualian tidak tertangkap jadi apa pun pernyataan catch Anda tidak akan pernah mengembalikan pernyataan baru yang telah Anda tulis.( https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_try_catch_finally?view=powershell-6
Dari atas:
Ini harus ditulis sebagai:
Try { Import-Module SomeModule -Force -Erroraction stop Write-Host "yep" } Catch { Write-Host "nope" }
Yang mengembalikan:
Dan jika Anda benar-benar ingin teliti, Anda harus menambahkan cmdlet lain yang disarankan
Get-Module -ListAvailable -Name
danGet-Module -Name
ekstra hati-hati, sebelum menjalankan fungsi / cmdlet lainnya. Dan jika diinstal dari psgallery atau di tempat lain Anda juga dapat menjalankanFind-Module
cmdlet untuk melihat apakah ada versi baru yang tersedia.sumber
Anda dapat menggunakan
Get-InstalledModule
If (-not(Get-InstalledModule SomeModule -ErrorAction silentlycontinue)) { Write-Host "Module does not exist" } Else { Write-Host "Module exists" }
sumber
``
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 }
``
sumber
Berasal dari latar belakang Linux. Saya lebih suka menggunakan sesuatu yang mirip dengan grep, oleh karena itu saya menggunakan Select-String. Begitu pun jika seseorang tidak yakin dengan nama modul lengkapnya. Mereka dapat memberikan inisial dan menentukan apakah modul tersebut ada atau tidak.
Get-Module -ListAvailable -All | Select-String Module_Name
(dapat menjadi bagian dari nama modul)sumber
Berikut adalah kode untuk memeriksa apakah modul AZ dipasang atau tidak:
$checkModule = "AZ" $Installedmodules = Get-InstalledModule if ($Installedmodules.name -contains $checkModule) { "$checkModule is installed " } else { "$checkModule is not installed" }
sumber