Как экспортировать в csv каждый write-host? - PullRequest
0 голосов
/ 05 марта 2019

У меня есть следующий скрипт, который отображает соединения каждой базы данных на сервере

Я хочу создать и экспортировать в csv заголовки столбцов «server», «database» и «connection information», ив основном выводят имя сервера, имя DBName и информацию о соединении в соответствующий столбец.

Я изучил PSCustomObject, но я не уверен, как именно реализовать это в моем сценарии

write-host "`r`n            Server            |               DataBase               |       Connection info      `r`n" -foregroundcolor white -backgroundcolor darkyellow

Import-Module SqlServer

$oldAS = New-Object Microsoft.AnalysisServices.Server
$oldAS.connect("server1")

foreach ($db in $oldAS.Databases){
    $compatibility_level = $db.CompatibilityLevel
    if($compatibility_level -lt 1200)
    {
      $OLDdbName = $db.Name
      Write-Host $OLDdbName -Fore green
[PSCustomObject]@{
    DataBase = $OLDdbName
}
      $db.DataSources | ForEach-Object{write-host "$($_.ConnectionString)";
    [PSCustomObject]@{
        "Connection Info" = $_.ConnectionString
              }
}
    }
    else
    {
        $AS = new-Object Microsoft.AnalysisServices.Tabular.Server
        $AS.Connect("server1")

        foreach ($dbt in $AS.Databases | Where-Object{$compatibility_level -ge 1200} ){
          $dbName = $dbt.Name
          Write-Host $dbName
   [PSCustomObject]@{
        DataBase = $dbName
    }
          if(($dbt.model.datasources[0]).GetType().Name -match "ProviderDataSource") 
          {
            write-host "$($dbt.model.datasources[0].ConnectionString)"
            }
          else {
                #$dbt.model.datasources[0].ConnectionDetails.ToString(); #ToJson
                write-host "$($dbt.model.datasources[0].Credential.ToString())"
   [PSCustomObject]@{
        "Connection Info" = "$($dbt.model.datasources[0].Credential.ToString())"
    }
            }
        }
    }
} | Export-Csv -Path .\CONNECTIONS_LOG.csv -NoTypeInformation -Append

РЕДАКТИРОВАТЬ:

Import-Module SqlServer

$oldAS = New-Object Microsoft.AnalysisServices.Server
$oldAS.connect("server1")

#create .net array object
$exportObject = New-Object System.Collections.ArrayList

#create ordered dictionary so column names
#come out in the ordered they were created
$rowObject = [ordered]@{}

foreach ($db in $oldAS.Databases){
    $compatibility_level = $db.CompatibilityLevel
    if($compatibility_level -lt 1200)
    {
      $OLDdbName = $db.Name
      Write-Host $OLDdbName -Fore green
      $db.DataSources | ForEach-Object{
      write-host "$($_.ConnectionString)"

      $rowObject.'Connection' = $($_.ConnectionString)
      $exportObject.Add((New-Object PSObject -Property $rowObject)) | Out-Null
      }

      $rowObject.'Database' = $OLDdbName 
      $exportObject.Add((New-Object PSObject -Property $rowObject)) | Out-Null
    }
    else
    {
        $AS = new-Object Microsoft.AnalysisServices.Tabular.Server
        $AS.Connect("server1")

        foreach ($dbt in $AS.Databases | Where-Object{$compatibility_level -ge 1200} ){
          $dbName = $dbt.Name
          Write-Host $dbName

          $rowObject.'Database' = $dbName
            $exportObject.Add((New-Object PSObject -Property $rowObject)) | Out-Null

          if(($dbt.model.datasources[0]).GetType().Name -match "ProviderDataSource") 
          {
            write-host "$($dbt.model.datasources[0].ConnectionString)"
                $rowObject.'Connection' = $($dbt.model.datasources[0].ConnectionString)
                $exportObject.Add((New-Object PSObject -Property $rowObject)) | Out-Null
            }
          else {
                #$dbt.model.datasources[0].ConnectionDetails.ToString(); #ToJson
                write-host "$($dbt.model.datasources[0].Credential.ToString())"

                $rowObject.'Connection' = $($dbt.model.datasources[0].Credential.ToString()) 
                $exportObject.Add((New-Object PSObject -Property $rowObject)) | Out-Null
            }
        }
    }
}

$exportObject | Export-CSV "C:\temp\dbinfo.csv" -NoTypeInformation -Encoding UTF8 -Delimiter ','

1 Ответ

0 голосов
/ 05 марта 2019

Я не могу расшифровать, что делает ваш скрипт, но вот скрипт Powershell, который использует sqlps для получения информации базы данных из экземпляра SQL по умолчанию на моем локальном компьютере.Он загружает информацию для каждой базы данных в объект PowerShell и добавляет объект в массив .NET.Затем массив .NET экспортируется в CSV-файл.

Мой SQL Server называется toshiba-bill

cls
Import-Module "sqlps" -DisableNameChecking

#create .net array object
$exportObject = New-Object System.Collections.ArrayList

#create ordered dictionary so column names
#come out in the ordered they were created
$rowObject = [ordered]@{}

#the sqlps dir SQLSERVER command returns 
#Name, Status, Containment Type, Recovery Model, CompatLvl, Collation, and Owner
#for each database in the default instance
$databases = @(dir SQLSERVER:\\SQL\toshiba-bill\Default\Databases) 

foreach ($database in $databases)
{
    $rowObject.'Database name' = $database.Name
    $rowObject.Status = $database.Status
    $rowObject.'Recovery Model' = $database.RecoveryModel
    $exportObject.Add((New-Object PSObject -Property $rowObject)) | Out-Null
}

$exportObject | Export-CSV "C:\temp\dbinfo.csv" -NoTypeInformation -Encoding UTF8 -Delimiter ','

Вывод

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...