0

以下のスクリプトを使用してデータとログ ファイルの情報を取得し、以下の xml ノードに従って出力を調整しようとしています。

param
(

$ClientName,
$Sourcedatabase,
$DestServer,
$DESTINATIONDB

)


$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$DataSet = New-Object System.Data.DataSet

$SqlConnection.ConnectionString = "Server = $DestServer; Database = '$DESTINATIONDB'; Integrated Security = True"

$SqlCmd.CommandText = "select f.physical_name from sys.master_files f, sys.databases d where f.database_id = d.database_id and
 d.name = 'master'" 



$SqlCmd.Connection = $SqlConnection
$SqlAdapter.SelectCommand = $SqlCmd
$SqlAdapter.Fill($DataSet)|out-null


foreach ($Row in $Dataset.Tables[0].Rows)
{ 

  $dev1 = $($Row[0])


  $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
  $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
  $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
  $DataSet = New-Object System.Data.DataSet

   $SqlConnection.ConnectionString = "Server = $ClientName; Database = $Sourcedatabase; Integrated Security = True"

  $SqlCmd.CommandText = "select f.name ,f.physical_name from sys.master_files f, sys.databases d where f.database_id = d.database_id and
 d.name = '$Sourcedatabase'" 



 $SqlCmd.Connection = $SqlConnection
 $SqlAdapter.SelectCommand = $SqlCmd
 $SqlAdapter.Fill($DataSet)|out-null

  foreach ($Row in $Dataset.Tables[0].Rows)
  { 


      if($dev1.EndsWith(".mdf") -and $($Row[1]).EndsWith(".mdf"))
     {
      $dev = "<device>|" + $Sourcedatabase + "|#12!" + $DESTINATIONDB 
     $dev = $dev + "|#12!" + $($Row[0]) +"|#12!"
  $dev = $dev + $dev1 +"|#12!"
  $dev = $dev + $($Row[1])
  $dev = $dev + "</device>" 
  $dev
     }


     if($dev1.EndsWith(".ldf") -and $($Row[1]).EndsWith(".ldf"))
     {
      $dev = "<device>|" + $Sourcedatabase + "|#12!" + $DESTINATIONDB 
  $dev = $dev + "|#12!" + $($Row[0]) +"|#12!"
  $dev = $dev + $dev1 +"|#12!"
  $dev = $dev + $($Row[1])
  $dev = $dev + "</device>" 
  $dev
     }
    }
  }

出力は次のようになります

|test_restore|#12!testCDC|#12!test_replication|#12!D:\MSSQL\DATA\MSSQL10.MSSQLSERVER\MSSQL\DATA\master.mdf|#12!D:\MSSQL\DATA\Test _Restore.mdf | test_restore|#12!testCDC|#12!test_replication_log|#12!D:\MSSQL\DATA\MSSQL10.MSSQLSERVER\MSSQL\DATA\mastlog.ldf|#12!L:\MSSQL\LOG\ Test_Restore_log.ldf

出力を取得できます...しかし、データベースに複数のデータファイルがある場合...データファイルは1つしか取得できません...これについて私を助けてください...

前もって感謝します...

4

1 に答える 1

0

あなたはこれを難しい方法でやっていると思います... powershellを適切に使用するようにしてください

ステップ 1: sqlserver 2008 を使用している場合

SQL スナップピンが登録され、追加されていることを確認してください: https://blogs.msdn.com/b/dtjones/archive/2011/03/31/loading-sql-server-snapins-into-your-powershell-session.aspx?Redirected =真

ps コマンドラインでこれを実行できるはずです (失敗しません) set-Location Sqlserver:\ または Get-PSProvider は sqlserver を含む行を返す必要があります

これは、レスト/ディレクトリ スタイルで sqlserver に問い合わせることができることを意味します。

ステップ 2: cd SQLSERVER:\SQL\YOURSQLSERVERNAME\default\databases\YOURDATABASENAME\logfiles を YOURDATABASENAME と YOURSQLSERVERNAME (通常はコンピュータ名) に置き換えます。

これで、dir this this "directory" または dir | を実行できます。FileName (dir).FileName を選択します。

于 2013-05-17T11:27:26.350 に答える