2011-01-27 14 views
13

Mi piacerebbe avere a disposizione le estensioni PowerShell di SQL Server ogni volta che avvii PowerShell caricando gli snap-in nel mio script profile.ps1. Ho trovato un articolo here con un esempio di script che mostra come fare questo, e questo funziona bene sul mio box Windows XP a 32-bit.Problemi relativi alle estensioni di PowerShell per SQL Server 2008 R2 al di fuori di SQLPS

Sfortunatamente, sul mio computer Windows 7 a 64 bit, questo esplode. Se provo a lanciare questo script con l'PowerShell a 64 bit, ottengo:

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 

Se corro questo, invece in un 32 bit di PowerShell, ottengo:

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 

mi piacerebbe essere in grado di eseguire questo in un PowerShell a 64 bit, se possibile. A tal fine, ho rintracciato quello che pensavo fosse il DLL di estensione PowerShell e in un amministratore a 64 bit: nell'alzare PowerShell mi sono imbattuto:

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

Nessun dadi. Sebbene installutil sia sembrato indicare il successo, ottengo ancora il messaggio di errore "Nessun snap-in registrato per Windows PowerShell versione 2" quando eseguo lo script.

Qualcuno ha qualche suggerimento su dove vado da qui?

risposta

19

Ho usato questo script senza problemi su macchine x64. Il problema con l'invocazione x86 è che lo script cerca le chiavi di registro che su un'istanza x64 sono accessibili solo da PowerShell x64. Per l'invocazione x64 puoi provare a registrare gli snap-in poiché questo è il messaggio di errore che stai ricevendo. Esegui come amministratore ...

Modifica questo:

cd $sqlpsPath 
Add-PSSnapin SqlServerCmdletSnapin100 
Add-PSSnapin SqlServerProviderSnapin100 

a questo:

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  

Una soluzione ancora migliore non è utilizzare Add-PSSnapin invece trasformare sqlps in un modulo. Ho post sul blog qui: http://sev17.com/2010/07/10/making-a-sqlps-module

aggiornamento per SQL Server 2012 - viene ora un modulo sqlps è possibile installare al posto di quanto sopra blog: http://www.microsoft.com/en-us/download/details.aspx?id=35580

+0

Poiché non volevo utilizzare un PowerShell con privilegi di amministrazione ogni volta che aggiungevo gli snap-in, ho usato il metodo del modulo SQLPS dal tuo blog e funziona come un incantesimo! Grazie! – Irinotecan

+0

Nessun problema. Anch'io preferisco il metodo del modulo, ma tieni presente che la registrazione per un nuovo snap-in deve essere eseguita una sola volta come amministratore. Dopodiché puoi semplicemente eseguire add-pssnapin. –

+0

Lo stesso problema con lo snap-in di SharePoint PS. La soluzione funziona anche nel mio caso (basta eseguire il lcate della DLL nel GAC: 'C: \ Windows \ assembly \ GAC_MSIL \ Microsoft.SharePoint.PowerShell \ 14.0.0.0__71e9bce111e9429c \ Microsoft.SharePoint.PowerShell.dll'). Grazie –

0

È possibile che gli assembly snap-in siano compilati solo per x86 a causa delle dipendenze su oggetti COM SMO nativi a 32 bit. Se fosse possibile eseguirli in una shell a 64 bit, sono abbastanza sicuro che MS avrebbe spedito entrambe le shell di gestione x86 e x64.

2

mi rendo conto che questo è un po 'un problema vecchio ma con un Installazione standard di Windows e SQL Server 2012 è possibile utilizzare direttamente il comando Invoke-Sqlcmd senza caricare nulla in anticipo poiché verrà importato automaticamente il modulo sqlps. Tuttavia lasciandolo fare che spesso causano problemi in modo da importare il modulo da soli con le linee di seguito nello stesso posto nel codice come si è utilizzato per utilizzare il componente aggiuntivo pssnapin comandi

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

Simile a quello pubblicato sul this MS web forum.

La riga del modulo di importazione in alto modifica il percorso corrente in qualcosa che rende le stringhe del percorso UNC come "\\ server \ condivisione \ percorso \ nomefile.ext" non funziona con molti cmd-lets.Quindi memorizziamo il percorso corrente prima e lo cambiamo dopo il comando import-module.

+0

o "Posizione push"; Import-Module 'sqlps' -DisableNameChecking; Pop-Location' –

+0

@ChaseFlorell: Ho provato la posizione push e pop, ma ho continuato a ricevere un messaggio di errore che diceva che Pop-Location non esisteva (dopo l'esecuzione del modulo di importazione). L'uso di una variabile come suggerito da BeowulfNode42 sembra molto più affidabile. – jmoreno

Problemi correlati