如何编写powershell脚本列出来自多个服务器的可用数据库?

时间:2016-09-13 12:55:57

标签: sql-server powershell

要求:我的要求是我必须列出150台服务器中的可用数据库。每台服务器至少有1个实例,最多15个实例。

下面的脚本仅适用于sqlserver.txt中列出的实例,但我需要跨多个服务器获取多个实例。

帮助很高。

ForEach ($instance in Get-Content "C:\PowerSQL\SQL_Servers.txt") 
{ 
    Import-Module SQLPS -DisableNameChecking 
    Invoke-SQLcmd -Server $instance -Database master 'select @@servername as InstanceName,name as DatabaseName,state_desc as DBStatus from sys.databases' | Format-Table       
}

2 个答案:

答案 0 :(得分:2)

您可以使用此脚本查找网络上所有可访问的实例并在那里运行查询:

Import-Module SQLPS -DisableNameChecking 
$servers = [System.Data.Sql.SqlDataSourceEnumerator]::Instance.GetDataSources() 

ForEach ($i in $servers) { 
    $instance = $i.ServerName+"\"+$i.InstanceName
    Invoke-SQLcmd -Server $instance -Database master 'select @@servername as InstanceName,name as DatabaseName,state_desc as DBStatus from sys.databases' | Format-Table       
}

如果您只需要传递服务器名称,请使用$instance = $i.ServerName。部分代码很久以前来自here

修改

使用CSV文件写入并捕获错误:

Import-Module SQLPS -DisableNameChecking 
$servers = [System.Data.Sql.SqlDataSourceEnumerator]::Instance.GetDataSources() 
$results = @()
ForEach ($i in $servers) { 
    $instance = $i.ServerName+"\"+$i.InstanceName

    try {
        $sqlres = Invoke-SQLcmd -Server $instance -Database master 'select @@servername as InstanceName,name as DatabaseName,state_desc as DBStatus from sys.databases'

        ForEach($st in $sqlres) {
           $instanceinfo = @{            
                    InstanceName = $st.InstanceName
                    DatabaseName = $st.DatabaseName                 
                    DBStatus     = $st.DBStatus
            } 
            $results += New-Object PSObject -Property $instanceinfo     
        }
    } catch {
        "error when running Invoke-SQLcmd "+$instance
        Write-Host($error)
    }
}

$results | export-csv -Path D:\sql_instances_info.csv -NoTypeInformation

答案 1 :(得分:0)

我不知道这里有什么问题。您可以将所有服务器/实例放在txt文件中并迭代:

#array of addresses, this can be fetched from file
$list = "localhost\SQL2014",".\SQL2014","(local)\SQL2014" #MyServer\MyInstance

$list | `
  % { Invoke-Sqlcmd -Server $_ -Database master 'select @@servername as InstanceName,name as DatabaseName,state_desc as DBStatus from sys.databases' } | `
  Format-Table -AutoSize

如果这些是没有集成安全性的远程服务器,则需要传递-UserName-Password个参数。