0

我正在編寫旨在檢查服務器版本號和平臺作爲服務器交付QA檢查一部分的腳本。SMO對象不執行方法

目的是檢查任何版本高於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 |獲得會員包括線路:

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 

這是怎麼回事?

回答

0

它似乎在這裏工作很好,除了一件事。您在第二個switch聲明中忘記了break。第二個正則表達式不應該是一個角色類,只是一個直接匹配。

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" 
} 
+0

我需要休息,如果該列表是詳盡? CompareTo()方法只能返回-1,0或1嗎? –

+0

嗯,是的,沒有。中斷確保它不會穿透。另一方面,你的第二個正則表達式是不正確的。我在我的代碼中糾正了它。 – Eris

+0

感謝您的正則表達式修復。顯然,這不是我的強項。你說得對,我確實需要休息。我不知道爲什麼我會在第一個開關中記住它,而不是第二個。 –