Манифест PowerShell, ссылающийся на внешнюю сборку

StackOverflow https://stackoverflow.com/questions/2120485

  •  22-09-2019
  •  | 
  •  

Вопрос

Можно ли зарегистрировать новый модуль PowerShell, просто определив манифест нового модуля и поместив его в указанный каталог?

Например.новый модуль с именем SampleModule должен быть создан.Я поместил пустой файл манифеста SampleModule.psd1 в каталоге <%PSModulePath%>\SampleModule.(Не имеет значения, какой путь к модулю (пользовательский или глобальный) используется).

Этого достаточно, чтобы PowerShell перечислил мой новый модуль с помощью Get-Module -ListAvailable команда.

На следующем шаге я пытаюсь заполнить манифест и установить ModuleToProcess свойство сборки, расположенной в другом каталоге.Вызов Import-Module не удается, PowerShell не может найти сборку.

Это было полезно?

Решение 2

А Get-Module командлет с -ListAvailable параметр работает хорошо.Проблема была в архитектуре, т.е.32-битный хост PowerShell не смог вывести список 64-битных модулей...

Другие советы

Да действительно.На самом деле, у меня есть очень изящный трюк, позволяющий сделать это для оснастки SQL.Первый фрагмент кода — это функция, которая создаст для вас манифест модуля из одного из местоположений модуля.Он по-прежнему будет запрашивать у вас (как это делает командлет New-ModuleManifest) некоторые необходимые параметры, например описание.Он находит файлы любых типов и форматов, а также любые .dll с именем .ps.dll (большинство оснасток следуют этому соглашению), а затем создается манифест модуля, который обертывает исходный модуль.Второй фрагмент кода делает это специально для SQL PSSnapin.

function New-ModuleManifestFromSnapIn {

    [CmdletBinding(SupportsShouldProcess=$true, ConfirmImpact='Medium')]
    param(

    [Parameter(Mandatory=$true, Position=0)]
    [System.String]
    ${Path},

    # The location in the filesystem where the V1 snapin resides
    [Parameter(Mandatory=$true)]
    [System.String]
    ${OriginalPath},

    [System.Guid]
    ${Guid},

    [Parameter(Mandatory=$true)]
    [AllowEmptyString()]
    [System.String]
    ${Author},

    [Parameter(Mandatory=$true)]
    [AllowEmptyString()]
    [System.String]
    ${CompanyName},

    [Parameter(Mandatory=$true)]
    [AllowEmptyString()]
    [System.String]
    ${Copyright},

    [ValidateNotNull()]
    [System.Version]
    ${ModuleVersion},

    [Parameter(Mandatory=$true)]
    [AllowEmptyString()]
    [System.String]
    ${Description},

    [System.Reflection.ProcessorArchitecture]
    ${ProcessorArchitecture},

    [System.Version]
    ${PowerShellVersion},

    [System.Version]
    ${ClrVersion},

    [System.Version]
    ${DotNetFrameworkVersion},

    [System.String]
    ${PowerShellHostName},

    [System.Version]
    ${PowerShellHostVersion},

    [System.Object[]]
    ${RequiredModules},

    [AllowEmptyCollection()]
    [System.String[]]
    ${ScriptsToProcess},

    [AllowEmptyCollection()]
    [System.Object[]]
    ${ModuleList},

    [AllowNull()]
    [System.Object]
    ${PrivateData},

    [Switch]
    ${PassThru}
    )

    process {
        $types = Get-ChildItem $originalPath -Filter *.types.ps1xml
        $formats = Get-ChildItem $originalPath -Filter *.format.ps1xml
        $dlls = Get-ChildItem $originalPath -Filter *.ps*.dll
        $null = $psBoundParameters.Remove("OriginalPath")
        $psBoundParameters += @{
            VariablesToExport = "*"
            FunctionsToExport = "*"
            AliasesToExport = "*"
            CmdletsToExport = "*"
            FileList = @()
            RequiredAssemblies = @()
            ModuleToProcess = ""
            NestedModules = @($dlls | Select-Object -ExpandProperty FullName)
            TypesToProcess = @($types | Select-Object -ExpandProperty FullName)
            FormatsToProcess = @($formats | Select-Object -ExpandProperty FullName)
        }
        New-ModuleManifest @psBoundParameters
    }
}

Этот фрагмент покажет создание манифеста, указав инструмент @SQL.

$basePath = $env:SqlSamplesSourceDataPath | Split-Path
if (${env:ProgramFiles(x86)}) {
    $basePath = $basePath.Replace($env:ProgramFiles, ${env:ProgramFiles(x86)})
} 

$path = Join-Path $basePath "Binn"


$basicMetaData = @{
    Author = "Microsoft Corporation"
    Description = "A Manifest to enable using the SQL PowerShell snapin in V2"
    CompanyName = "Microsoft Corporation"
    Copyright = (Get-Date).Year 
}
New-ModuleManifestFromSnapin -Path $psScriptRoot\Sql.psd1 -OriginalPath $path @BasicMetaData

Последний фрагмент скопирует любые файлы с именем текущей культуры (т.SQL\en-us) в каталог модуля, что позволит Get-Help работать с командлетами.

Этот трюк сработал для нескольких оснасток, но может потребовать некоторых настроек для каждой оснастки, которую вы хотите повторно представить как модуль.К счастью, это единовременные затраты.

$Culture = Get-Culture
$CultureList = "$path\$culture", 
    (Join-Path $path $culture.ThreeLetterIsoLanguageName), 
    (Join-Path $path $culture.TwoLetterIsoLanguageName)

$CultureDirectory = Get-Item $CultureList -ErrorAction SilentlyContinue |
    Select-Object -First 1 

if ($CultureDirectory) {
    $localDir = Join-Path $psScriptRoot (Split-Path $CultureDirectory -Leaf)
    $item = Get-Item $localDir -ErrorAction SilentlyContinue 
    if ($item) {
        Remove-Item $item -Recurse -Force 
    }
    Copy-Item $CultureDirectory $LocalDir -Recurse
}

Надеюсь это поможет

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top