2011-01-27 43 views
13

我希望通過在我的profile.ps1腳本中加載管理單元啓動PowerShell來爲我提供SQL Server PowerShell擴展。我找到一篇文章here,其中有一個腳本示例,演示瞭如何執行此操作,並且這在我的32位Windows XP盒子上正常工作。在SQLPS之外使用SQL Server 2008 R2 PowerShell擴展的問題

不幸的是,在我的64位Windows 7機器上,這個問題已經暴露出來。如果我嘗試使用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中運行。爲此,我找到了我認爲是PowerShell的擴展DLL和64位管理員升高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似乎表示成功,但運行腳本時仍然出現「沒有爲Windows PowerShell版本2註冊管理單元」錯誤消息。

任何人有任何建議,我去哪裏?

回答

19

我已經在x64機器上使用這個腳本而沒有問題。 x86調用的問題在於腳本查找x64實例上只能從x64 PowerShell訪問的註冊表項。對於x64調用,您可以嘗試註冊管理單元,因爲這是您收到的錯誤消息。以管理員身份運行...

更改此:

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  

一個更好的解決方案是不使用附加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

+0

由於我不想每次添加管理單元時都需要使用管理提升的PowerShell,所以我在您的博客中使用了SQLPS模塊方法,它的工作原理就像一個魅力!謝謝! – Irinotecan 2011-01-28 19:16:56

+0

沒問題。我也更喜歡模塊方法,但請記住,只需要以管理員身份運行一次即可。之後,您可以運行add-pssnapin。 – 2011-01-29 03:22:53

0

由於依賴於本機32位SMO COM對象,因此可能只爲x86編譯snapin程序集。如果可以在64位shell中運行它們,我很肯定MS會提供x86和x64管理shell。

2

我意識到這是一個有點舊的問題,但有股票標準的Windows和SQL Server 2012安裝,你可以直接使用命令Invoke-Sqlcmd而不用預先加載任何東西,因爲它會自動導入sqlps模塊。但是讓它這樣做往往會導致問題,因此與線導入自己的模塊下方在同一個地方在你的代碼,你以前用的是外接pssnapin命令

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

類似的是張貼在this MS web forum

上面的導入模塊行將當前路徑更改爲使UNC路徑字符串(如\\ server \ share \ path \ filename.ext)不能用於大量cmd-let的情況。因此,我們先存儲當前路徑,並在import-module命令之後將其更改回來。