我正在编写旨在检查服务器版本号和平台的脚本,作为服务器交付 QA 检查的一部分。
目的是仅检查高于 2008 r2 SP1 的任何版本以及标准版或企业版。结果,通过或失败,最终应该写入日志,但我还没有那么远。
添加 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 模块后运行相同的代码,则代码不起作用。
检查版本名称的 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
这是怎么回事?