我想知道是否有人可以帮助显示以下代码。如果可能的话,我基本上是在尝试重新散列此代码,以允许我针对名为“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、函数、脚本文件或可运行程序的名称。检查名称的拼写,或者是否是路径。