2016-09-13 5 views
1

要件:私は150台のサーバーから利用可能なデータベースをリストアップする必要があります。各サーバーには、最小1インスタンスと最大15インスタンスがあります。複数のサーバーから利用可能なデータベースを一覧表示するpowershellスクリプトの記述方法?

以下のスクリプトは、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  
} 
+0

あなたはすべての反復で 'SQLPS'をインポートする必要はありません。 –

+0

多くの感謝のPawelの返信です。あなたは私の必要条件で私を助けてくれますか? – SNR

答えて

0

ここで何が問題なのかわかりません。それらが統合されたセキュリティなしでリモートサーバーである場合は、-UserName-Password引数を渡す必要があります

#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 
:あなたはtxtファイル内のすべてのサーバー/インスタンスを入れて繰り返すことができます。

+0

Pawel、私はインスタンス名の代わりにサーバー名だけを渡したいと思います。インスタンス名を指定すると、それ以外の場合はデフォルトインスタンスだけをスキップし、名前付きインスタンスをスキップします。失敗した試行。 – SNR

+0

ご協力いただきありがとうございます。 – SNR

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ファイルへの書き込みとエラーキャッチして

EDIT

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 
+0

G0fr1がすべてのインスタンスをリストアップしてくれてありがとうございます。あなたが気にしない場合は、失敗したインスタンスを維持するか、インスタンスの詳細を停止するためにlog.txtを保持するのを手伝ってください。結果をCSV形式に保存したり、ファイルを上書きしたりすることができれば幸いです。 – SNR

+0

私はCSVへの書き込みとエラーキャッチを追加します。正常に動作するはずです。これはループ内で 'Invoke-SQLcmd'を実行し、データを収集します。その後、 'D:\ sql_instances_info.csv'ファイルに書き込む – gofr1

+0

多くのおかげでg0fr1。あなたの助けが高く評価されます。 – SNR

関連する問題