Манифест PowerShell, ссылающийся на внешнюю сборку
-
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
}
Надеюсь это поможет