2013-02-19 80 views
2

我想知道是否有人可以幫助顯示下面的代碼。我基本上試圖讓這個代碼重新哈希,如果可能的話,讓我運行它在一個名爲「servers.txt」的文本文件中提供的一組服務器名稱。Powershell的Powershell DBCC CheckDB

的DBCC應該由PS腳本運行和運行對所有DB爲服務器名。我沒有足夠的速度與PS瞭解如何爲此腳本執行此操作。

如何改變它允許值的堵塞,而不是被硬編碼爲每個服務器名?

我讀過解決此一點,看了看Invoke-Sql命令我相信這是一個SQL 2008擴展PS。

不幸的是,PS的環境是一個SQL 2005框和我沒有能力讓這個移動的,所以不要把我想歪了能夠使用調用

請查看原代碼,然後我的實驗,試圖得到它使用invoke來運行。

$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'不被識別爲n小命令,功能,腳本文件或可操作程序。檢查名稱的拼寫,或者路徑。

回答

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 $_ 
} 
+0

這是極好的謝謝 - 它工作得很好..我不能要求更多,但我是!抱歉!你能幫我看看如何將結果導出到一個csv文件,例如..我看到有命令Export-Csv「c:\ powershell \ reports \ DBCC_results.csv」例如.. – MoOriginal 2013-02-20 14:15:18

+0

這樣的事情? {Export-Csv「c:\ powershell \ DBCC \ $ messageText-DBCC.csv」} – MoOriginal 2013-02-20 14:32:37

+0

已經在txt文件中測試了只有一個服務器名稱的腳本,即使嘗試了不同的服務器 - 2008和2005,也得到相同的錯誤.... .........它似乎管理主數據庫,然後跟着.......................例外調用「0」關閉「參數:「Timeout expired。超時時間在操作完成之前已經過去或者服務器沒有響應。」在C:\ Powershell \ CheckDB.ps1:27 char:22 + $ reader.Close <<<<()+ CategoryInfo:NotSpecified:(:) [],MethodInvocationException + FullyQualifiedErrorId:DotNetMethodException – MoOriginal 2013-02-20 15:15:19