0

サーバー配信 QA チェックの一環として、サーバーのバージョン番号とプラットフォームを確認するためのスクリプトを作成しています。

これは、2008 r2 SP1 以降のバージョンと、Standard または Enterprise エディションのみを確認することを目的としています。結果は、合格または不合格で、最終的にはログに書き込まれるはずですが、まだそこまで進んでいません。

以下のコードは、SQL プロバイダーとコマンドセットのスナップインを追加した後、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 モジュールをインポートした後にこの同じコードを実行すると、コードは機能しません。

以下のように IF ステートメントで比較を実行しても、エディション名をチェックする switch ステートメントは常にデフォルトにヒットし、エラーをスローします。

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 

どうしたの?

4

1 に答える 1

0

1 つのことを除いて、ここでは問題なく動作するようです。break2 番目のswitchステートメントでを忘れました。2 番目の正規表現は、文字クラスであってはならず、単純な一致であってはなりません。

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"
}
于 2014-07-23T20:44:08.110 に答える