2

我想知道是否有人可以帮助显示以下代码。如果可能的话,我基本上是在尝试重新散列此代码,以允许我针对名为“servers.txt”的文本文件中提供的一组服务器名称运行它。

DBCC 应该由 PS 脚本运行并针对该服务器名的所有 DB 运行。我对 PS 的了解不够快,无法理解如何为这个脚本执行此操作。

如何更改它允许插入值而不是为每个服务器名硬编码?

我已经阅读了一些相关内容,并查看了Invoke-Sql我认为是 PS 的 SQL 2008 扩展的命令。

不幸的是,PS 环境来自 SQL 2005 盒子,我没有能力移动它,所以不要认为我不能使用调用

请查看原始代码,然后查看我的实验以尝试使用调用运行它。

$ScriptName = $myInvocation.MyCommand.Name
[void][reflection.assembly]::LoadWithPartialName("System.Data.SqlClient")
$ConnString = "Server=DB-OCC05;Integrated Security=SSPI;Database=master;Application Name=$ScriptName"
$MasterConn = new-object ('System.Data.SqlClient.SqlConnection') $ConnString
$MasterCmd = new-object System.Data.SqlClient.SqlCommand 
$MasterCmd.Connection = $MasterConn
$SqlDBCC = "DBCC CHECKDB(master) WITH TABLERESULTS"
$MasterCmd.CommandText = $SqlDBCC
$MasterConn.Open()
$Rset = $MasterCmd.ExecuteReader()
If ($Rset.HasRows -eq $true) {
    While ($Rset.Read()) {
        $line = $Rset["MessageText"]
        If ($Rset["Level"] -gt 10) {
            Write-Host $line -backgroundcolor Yellow -foregroundcolor Red
        } else {
            Write-Host $line 
        }
    }
    $Rset.Close()
}
$MasterConn.Close() 

然后我的测试从 SQL 2005 环境运行:

Invoke-Sqlcmd -Query "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance "MyComputer\MyInstance"

并且还尝试了这个测试:

gc "C:\Powershell\Servers.txt" | foreach-object {Invoke-Sqlcmd "DBCC checkdb;" -ServerInstance "$_\MyInstance"}

但是上面的测试运行没有起作用,原因是:

术语“Invoke-Sqlcmd”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。检查名称的拼写,或者是否是路径。

4

1 回答 1

2

对您的脚本进行一些修改。除了连接字符串和底部的几行用于加载 servers.txt 文件(每个实例一行的文本文件)并枚举其内容之外,一切基本相同:

function Execute-DBCC
{
    param (
        [parameter(Mandatory = $true)][string]$serverInstance
    )

    $connString = "Server=$serverInstance;Integrated Security=SSPI;Database=master;Application Name=$ScriptName"
    $masterConn = new-object ('System.Data.SqlClient.SqlConnection') $connString
    $masterCmd = new-object System.Data.SqlClient.SqlCommand 
    $masterCmd.Connection = $masterConn

    $masterCmd.CommandText = "EXECUTE master.sys.sp_MSforeachdb 'DBCC CHECKDB([?]) WITH TABLERESULTS'"
    $masterConn.Open()
    $reader = $masterCmd.ExecuteReader()

    if ($reader.HasRows -eq $true) 
    {
        while ($reader.Read()) 
        {
            $messageText = $reader["MessageText"]

            if ($reader["Level"] -gt 10) 
                { Write-Host $messageText -backgroundcolor Yellow -foregroundcolor Red  } 
            else 
                { Write-Host $messageText  }
        }

        $reader.Close()
    }

    $masterConn.Close() 
}




[void][reflection.assembly]::LoadWithPartialName("System.Data.SqlClient")

$servers = @(Get-Content ".\servers.txt")

$servers | %{
    Execute-DBCC $_
}
于 2013-02-19T16:43:18.163 回答