Powershell DBCC CheckDB de Powershell

Je me demandais si quelqu'un pouvait aider avec le code suivant montré. Essentiellement, j'essaie de récupérer ce code si possible pour me permettre de l'exécuter sur un set de noms de servers fournis dans un file text nommé "servers.txt".

Le DBCC doit être exécuté par le script PS et exécuté sur tous les DB pour ce nom de server. Je ne suis pas assez rapide avec PS pour comprendre comment faire pour ce script.

Comment le changer permet de twigr des valeurs au lieu d'être codé en dur pour chaque nom de server?

J'ai lu un peu autour de cela et regardé la command Invoke-Sql qui je crois est une extension SQL 2008 à PS.

Malheureusement, l'environnement PS provient d'une boîte SQL 2005 et je n'ai pas le pouvoir d'get ce déplacé donc je ne pense pas être en mesure d'utiliser invoke

S'il vous plaît voir le code original, puis mon expérience pour essayer de le faire fonctionner en utilisant invoke.

 $ScriptName = $myInvocation.MyCommand.Name [void][reflection.assembly]::LoadWithPartialName("System.Data.SqlClient") $ConnSsortingng = "Server=DB-OCC05;Integrated Security=SSPI;Database=master;Application Name=$ScriptName" $MasterConn = new-object ('System.Data.SqlClient.SqlConnection') $ConnSsortingng $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() 

Et puis mon test exécuté à partir de l'environnement SQL 2005:

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

Et aussi essayé ce test:

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

Mais le test ci-dessus ne fonctionne pas cause de:

Le terme "Invoke-Sqlcmd" n'est pas reconnu comme le nom d'une cmdlet, d'une fonction, d'un file script ou d'un programme utilisable. Vérifiez l'orthographe du nom, ou si un path.

Quelques modifications à votre script. Tout est fondamentalement identique à l'exception de la string de connection et des quelques lignes en bas pour le chargement de votre file servers.txt (un file text avec une ligne par instance) et l'énumération de son contenu:

 function Execute-DBCC { param ( [parameter(Mandatory = $true)][ssortingng]$serverInstance ) $connSsortingng = "Server=$serverInstance;Integrated Security=SSPI;Database=master;Application Name=$ScriptName" $masterConn = new-object ('System.Data.SqlClient.SqlConnection') $connSsortingng $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 $_ }