Никаких оснасток не было зарегистрировано для Windows PowerShell версии 2

Я пытаюсь запустить Powershell script на веб-сервере, на котором не установлена ​​SQL Server Management Studio, но установлены все соответствующие пакеты из пакета обновления 2 (SP2) для Microsoft SQL Server 2008 R2. Вам нужно установить эти маленькие биты и куски, чтобы Powershell мог выполнять команды SQL.

Затем я запустил эту настройку script, которая предваряет вашу среду для команд SQL Server, запущенных с помощью Powershell:

$ErrorActionPreference = "Stop"

$sqlpsreg="HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.SqlServer.Management.PowerShell.sqlps"

if (Get-ChildItem $sqlpsreg -ErrorAction "SilentlyContinue")
{
    throw "SQL Server Powershell is not installed."
}
else
{
    $item = Get-ItemProperty $sqlpsreg
    $sqlpsPath = [System.IO.Path]::GetDirectoryName($item.Path)
}



/* Preload the assemblies. Note that most assemblies will be loaded when the provider
 is used. if you work only within the provider this may not be needed. It will reduce
 the shell footprint if you leave these out.*/

$assemblylist =
"Microsoft.SqlServer.Smo",
"Microsoft.SqlServer.Dmf ",
"Microsoft.SqlServer.SqlWmiManagement ",
"Microsoft.SqlServer.ConnectionInfo ",
"Microsoft.SqlServer.SmoExtended ",
"Microsoft.SqlServer.Management.RegisteredServers ",
"Microsoft.SqlServer.Management.Sdk.Sfc ",
"Microsoft.SqlServer.SqlEnum ",
"Microsoft.SqlServer.RegSvrEnum ",
"Microsoft.SqlServer.WmiEnum ",
"Microsoft.SqlServer.ServiceBrokerEnum ",
"Microsoft.SqlServer.ConnectionInfoExtended ",
"Microsoft.SqlServer.Management.Collector ",
"Microsoft.SqlServer.Management.CollectorEnum"


foreach ($asm in $assemblylist)
{
    $asm = [Reflection.Assembly]::LoadWithPartialName($asm)
}


//Set variables that the provider expects (mandatory for the SQL provider)

Set-Variable -scope Global -name SqlServerMaximumChildItems -Value 0
Set-Variable -scope Global -name SqlServerConnectionTimeout -Value 30
Set-Variable -scope Global -name SqlServerIncludeSystemObjects -Value $false
Set-Variable -scope Global -name SqlServerMaximumTabCompletion -Value 1000


//Load the snapins, type data, format data

Push-Location
cd $sqlpsPath


Add-PSSnapin SqlServerCmdletSnapin100
Add-PSSnapin SqlServerProviderSnapin100 
Update-TypeData -PrependPath SQLProvider.Types.ps1xml  
update-FormatData -prependpath SQLProvider.Format.ps1xml  
Pop-Location

В Add-PSSnapin SqlServerCmdletSnapin100 script выходит из строя со следующей ошибкой:

Никаких оснасток не было зарегистрировано для Windows PowerShell версии 2. На C:\Vantiv\Initialize-SqlpsEnvironment.ps1: 75 char: 13 + Add-PSSnapin < SqlServerCmdletSnapin100 # -ErrorAction SilentlyContinue     + CategoryInfo: InvalidArgument: (SqlServerCmdletSnapin100: String) [Добавить-PSSnapin], исключение PSArgumentException     + FullyQualifiedErrorId: AddPSSnapInRead, Microsoft.PowerShell.Commands.AddPSSnapinCommand

Я запустил поиск Google по этой ошибке, и единственным решением, которое я смог найти, было то, что люди говорили, что моя 64-разрядная консоль Powershell Console была указана на каталог SysWOW64, а не на System32. Это не относится ко мне. Мой указывает на System32.

Любые идеи? Что мне нужно сделать, чтобы заставить Powershell зарегистрировать эти оснастки?

Ответ 1

Если вы выполните:

Get-PSSnapin -Registered

вы получите список готовых к использованию оснасток для PowerShell (здесь только для SQL):

Name        : SqlServerCmdletSnapin100
PSVersion   : 2.0
Description : This is a PowerShell snap-in that includes various SQL Server cmdlets.

Name        : SqlServerProviderSnapin100
PSVersion   : 2.0
Description : SQL Server Provider

если вы не видите эти оснастки в списке, попробуйте опубликованное решение здесь.

Ответ 2

В слегка сходном ключе с приведенным выше ответом я обнаружил, что по умолчанию я использовал командную строку Visual Studio, которая работает в 32-разрядной версии.

Поэтому при использовании "InstallUtil" в моей библиотеке powershell регистрация произошла с 32-разрядной версией Powershell, поэтому я был смущен тем, что не смог найти мои командлеты в коллекции -Registered.

Если я впоследствии запустил powershell (x86), тогда мои snapins действительно были зарегистрированы, как и ожидалось. Итак, решение для меня состояло в том, чтобы перерегистрировать мои snapins из командной строки x64 или просто использовать x86-версию powershell.

Ответ 3

Исправление Windows Server 2008 R2 PowerShell для меня состояло в том, чтобы скопировать раздел реестра PowerShell с рабочего сервера на тот, у которого возникли проблемы.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\ 

Проблема решена. Теперь регистрируется snapin SharePoint PowerShell, и тот, который устанавливается с помощью SharePoint, работает.