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-Module
cmdlet을 클릭하여 사용 가능한 새 버전이 있는지 확인합니다.
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
'programing' 카테고리의 다른 글
같은 프로젝트에서 C#과 VB의 혼재 (0) | 2023.04.08 |
---|---|
PowerShell의 3진 연산자 (0) | 2023.04.08 |
부유 원소의 부모가 무너지지 않게 하려면 어떻게 해야 하나요? (0) | 2023.04.08 |
div의 내용을 맨 아래에 정렬하는 방법 (0) | 2023.04.08 |
Windows PowerShell: 명령 프롬프트 변경 (0) | 2023.04.08 |