Проблемы с использованием расширений PowerShell SQL Server 2008 R2 за пределами SQLPS

Я хотел бы иметь расширения SQL Server PowerShell, доступные мне, всякий раз, когда я запускаю PowerShell, загружая оснастки в свой профиль .ps1 script. Я нашел статью здесь с примером script, который показывает, как это сделать, и это отлично работает на моем 32-разрядном окне Windows XP.

К сожалению, на моей 64-битной машине Windows 7 это взрывается. Если я попытаюсь запустить этот script с 64-битным PowerShell, я получаю:

Add-PSSnapin : No snap-ins have been registered for Windows PowerShell version 2.
At C:\Users\xxxx\Documents\WindowsPowerShell\profile.ps1:84 char:13
+ Add-PSSnapin <<<<  SqlServerCmdletSnapin100
+ CategoryInfo          : InvalidArgument: (SqlServerCmdletSnapin100:String
[Add-PSSnapin], PSArgumentException
+ FullyQualifiedErrorId : AddPSSnapInRead,Microsoft.PowerShell.Commands.AddPSSnapinCommand

Если я запустил это вместо 32-битного PowerShell, я получаю:

Get-ItemProperty : Cannot find path 'HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds \Microsoft.SqlServer.Management.PowerShell.sqlps' because it does not exist.
At C:\Users\xxxx\Documents\WindowsPowerShell\profile.ps1:39 char:29
+     $item = Get-ItemProperty <<<<  $sqlpsreg
+ CategoryInfo          : ObjectNotFound: (HKLM:\SOFTWARE\...owerShell.sqlps:String) [Get-ItemProperty], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetItemPropertyCommand

Я хотел бы иметь возможность запускать это в 64-битном PowerShell, если это возможно. С этой целью я обнаружил, что я думал, что DLL с расширением Powershell и в 64-разрядной версии Administrator с повышенным PowerShell, который я запускал:

cd "C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn"
installutil Microsoft.SqlServer.Management.PSProvider.dll
installutil Microsoft.SqlServer.Management.PSSnapins.dll

Нет кубиков. Хотя installutil показала успех, я все равно получаю сообщение об ошибке "No snap-ins были зарегистрированы для Windows PowerShell версии 2" при запуске script.

У кого-нибудь есть предложения относительно того, куда я иду отсюда?

Ответы

Ответ 1

Я использовал этот script без проблем на машинах x64. Проблема с вызовом x86 заключается в том, что script ищет ключи реестра, которые на экземпляре x64 доступны только из x64 PowerShell. Для вызова x64 вы можете попробовать зарегистрировать snapins, поскольку это сообщение об ошибке, которое вы получаете. Запуск от имени администратора...

Измените это:

cd $sqlpsPath
Add-PSSnapin SqlServerCmdletSnapin100
Add-PSSnapin SqlServerProviderSnapin100 

:

cd $sqlpsPath
$framework=$([System.Runtime.InteropServices.RuntimeEnvironment]::GetRuntimeDirectory())
Set-Alias installutil "$($framework)installutil.exe"
installutil Microsoft.SqlServer.Management.PSSnapins.dll
installutil Microsoft.SqlServer.Management.PSProvider.dll
Add-PSSnapin SqlServerCmdletSnapin100
Add-PSSnapin SqlServerProviderSnapin100    

Еще лучше не использовать add-pssnapin, а вместо этого превращать sqlps в модуль. У меня есть сообщение в блоге: http://sev17.com/2010/07/10/making-a-sqlps-module

Обновление для SQL Server 2012 - теперь поставляется модуль sqlps, который вы можете установить вместо указанного выше блога: http://www.microsoft.com/en-us/download/details.aspx?id=35580

Ответ 2

Я понимаю, что это немного более старый вопрос, но при наличии стандартной версии Windows и SQL Server 2012 вы можете просто использовать команду Invoke-Sqlcmd, не загружая ничего заранее, так как она автоматически импортирует модуль sqlps. Однако, позволяя ему это делать, часто возникают проблемы, поэтому импортируйте модуль самостоятельно с приведенными ниже строками в том же месте в вашем коде, что и при использовании команд add-pssnapin

$cur = Get-Location
Import-Module 'sqlps' –DisableNameChecking
Set-Location $cur

Как и на этот веб-форум MS.

Строка импорта-модуля выше изменяет текущий путь на то, что делает строки UNC-пути, такие как "\\ server\share\path\filename.ext", не работает с большим количеством cmd-меток. Таким образом, мы сохраняем текущий путь до и меняем его после команды import-module.

Ответ 3

Возможно, сборки snapin скомпилированы для x86 только из-за зависимостей от собственных 32-битных SMO COM-объектов. Если бы можно было запустить их в 64-битной оболочке, я уверен, что MS отправила как оболочки управления x86, так и x64.