13

我正在尝试在未安装 SQL Server Management Studio 但已安装 Microsoft SQL Server 2008 R2 SP2 Feature Pack 中的所有相关软件包的 Web 服务器上运行 Powershell 脚本。您需要安装这些小部件,以便 Powershell 能够运行 SQL 命令。

然后我运行了这个设置脚本,为使用 Powershell 运行的 SQL Server 命令准备环境:

$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's 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,脚本失败并出现以下错误:

没有为 Windows PowerShell 版本 2 注册任何管理单元。在 C:\Vantiv\Initialize-SqlpsEnvironment.ps1:75 char:13 + Add-PSSnapin <<<< SqlServerCmdletSnapin100 #-ErrorAction SilentlyContinue + CategoryInfo : InvalidArgument: (SqlServerCmdletSnapin100: String) [Add-PSSnapin], PSArgumentException + FullyQualifiedErrorId : AddPSSnapInRead,Microsoft.PowerShell.Commands.AddPSSnapinCommand

我对这个错误进行了谷歌搜索,我能找到的唯一解决方案是人们说我的 64 位 Powershell 控制台快捷方式指向 SysWOW64 目录而不是 System32。这不是我的情况。我的指向 System32。

有任何想法吗?我需要做什么才能让 Powershell 注册这些管理单元?

4

3 回答 3

9

如果你这样做:

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

如果您在列表中看不到这些管理单元,请尝试此处发布的解决方案。

于 2012-11-09T16:15:09.130 回答
3

与上述答案有点相似,我发现默认情况下我使用的是 32 位运行的 Visual Studio 命令提示符。

因此,当对我的 powershell 库使用“InstallUtil”时,注册发生在 32 位版本的 Powershell 上,所以我很困惑,我在 -Registered 集合中找不到我的 cmdlet。

如果我随后启动了 powershell (x86),那么我的管理单元确实按预期注册了。因此,对我来说,解决方案是从 x64 命令提示符重新注册我的管理单元,或者干脆使用 x86 版本的 powershell。

于 2013-01-16T15:33:50.250 回答
0

对我来说,Windows Server 2008 R2 PowerShell解决方法是将注册表项从工作服务器复制PowerShell到有问题的服务器。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\ 

问题解决了。该SharePoint PowerShell管理单元现已注册,并且安装的管理单元可以SharePoint正常工作。

于 2016-01-23T15:21:38.997 回答