SMO对象不执行方法

时间:2014-07-23 20:28:46

标签: sql-server powershell sql-server-2014 windows-server-2012-r2

我正在编写脚本,旨在检查服务器版本号和平台,作为服务器交付QA检查的一部分。

目的是检查仅高于2008 r2 SP1和标准版或企业版的任何版本。结果,通过或失败,最终应该写入日志,但我还没那么远。

在为SQL提供程序和commandets添加管理单元后,下面的代码在Windows 2008和SQLServer 2008上按预期运行。

[Version]$gtVersion = "10.50.2500.0"

$server = Get-ChildItem SQLSERVER:\sql\$env:Computername


try {
IF($server){


    switch ($server.Version.Major)
        {
            10 {$versionName = "SQl Server 2008"}
            11 {$versionName = "SQl Server 2012"}
            12 {$versionName = "SQl Server 2014"}
        }

    $currentVersionString = "Current Version is $versionName $($server.ProductLevel) $($server.Edition) $($server.Version.ToString()):"


    switch ($server.Edition)
        {
            "Standard Edition (64-bit)" {break}
            "Enterprise Edition (64-bit)" {break}
            default {Throw "$currentVersionString Invalid Edition"}
        }


     switch -regex ($server.Version.CompareTo($gtVersion))
        {
             "0|[^-]1" {"$currentVersionString OK";break}
             default {"$currentVersionString Too Low"}
        }
} ELSE {Throw "Could not find current SQL Server version number"}
} catch [System.Exception] {$_.Exception.Message}

但是如果我在Windows 2012和SQLServer 2014上导入SQLPS模块后运行相同的代码,则代码不起作用。

检查版本名称的switch语句总是达到默认值并抛出错误,即使在如下IF语句中运行比较也能正常工作

IF($server.Edition -eq "Enterprise Edition (64-bit)") {"Editions Match"}

$ server.Version.CompareTo()方法也不起作用。它总是抛出“无法找到”CompareTo“的过载和参数计数:”1“。”

这是$ server.Version |的输出Get-Member包括以下行:

TypeName: System.Version

Name          MemberType Definition                                                                                                      
----          ---------- ----------                                                                                             
Clone         Method     System.Object Clone(), System.Object ICloneable.Clone()                                                         
CompareTo     Method     int CompareTo(System.Object version), int CompareTo(version value), int IComparable.CompareTo(System.Object o... 

直接比较版本号可以正常工作:

$server.version.Major -ge $gtVersion.Major #returns true
$server.version.Minor -ge $gtVersion.Minor #returns false

$ server.Version.ToString()也不起作用。它只返回一个空字符串对象,即使$ server.Version将以下输出返回给主机:

Major  Minor  Build  Revision
-----  -----  -----  --------
12     0      2000   -1 

发生了什么事?

1 个答案:

答案 0 :(得分:0)

除了一件事,它似乎在这里工作正常。您忘记了第二个break语句中的switch。第二个正则表达式不应该是一个字符类,只是一个直接匹配。

switch -regex ($server.Version.CompareTo($gtVersion))
    {
         "[0-1]" {"$currentVersionString OK"; break;}
         "-1"  {"$currentVersionString Too Low"; break; }
    }

开关的替代方案:

if($Server.Version.CompareTo($gtVersion) -ge 0) {
    "$currentVersionString OK"
} else {
    "$currentVersionString Too Low"
}