Powershell

Powershell dbatools 結合多個 Get-dbaxxx 命令的結果生成報告

  • May 19, 2020

我是 powershell 和 dbatools 的新手。這是一個很棒的工具,但是當我嘗試將幾個不同命令的結果組合成一個要導出到 csv 的數組時,它並沒有提供預期的結果。它只列印第一個命令的輸出。有人可以幫我加入所有三個變數的結果嗎?我要做的是編寫一個腳本來自動生成我們的 SQL Server 庫存和容量評估報告。

到目前為止,這是我的程式碼:

$Servers = Get-Content 'C:\Users\temp\ServerList.txt'

$reportData = @()

foreach ($Server in $Servers) {

 if (Test-Connection -ComputerName $Server -Count 1 -ErrorAction 'SilentlyContinue') {

   $OSInfo=Get-DbaOperatingSystem -ComputerName MyServer| Select ComputerName, OSVersion, Version, Architecture
   $DiskSPace=Get-DbaDiskSpace -ComputerName MyServer| Select ComputerName, Label, Name, Capacity, Free
   $SQLInstanceInfo=Connect-DbaInstance -SqlInstance MyServer | Select DbaInstanceName, Edition, NetPort, IsClustered, Processors, ProductLevel, ServiceName, 


   $reportData +=$OSInfo
   $reportData +=$DiskSPace
   $reportData +=$SQLInstanceInfo

 }

 else {

   write-host $Server "not connected"
 }
}

Write-Output $reportData | Format-Table

TL; 博士

PSCustomObject使用變數的屬性創建一個。


PowerShell 輸出格式化程序使用輸出集中的第一個對像作為模板,以表格格式顯示後續對象。

如果第一個對象具有屬性 A、B 和 C,則它們將是表頭。

如果第二個對像只有屬性 D、E 和 F,則將顯示一個空行。

您可以通過以下範例自己查看:

$TestResults = @()

$Test1 = [PSCustomObject]@{
   Name = 'Test1'
   Type = 'PSCustomObject'
}
$Test2 = [PSCustomObject]@{
   Name = 'Test2'
   Type = 'PSCustomObject'
}
$Test3 = [PSCustomObject]@{
   Label = 'Test3' # <-- This is "Label", not "Name".
   Type = 'PSCustomObject'
}

$TestResults += $Test1
$TestResults += $Test2
$TestResults += $Test3

# Show output:
$TestResults

$TestResults 變數的結果


選項 1 - 計算屬性(在您的場景中不推薦):

那麼,您可以使用計算的屬性重命名變數中的屬性以具有相同的名稱嗎?

$Test3 | Select-Object @{ Name = 'Name'; Expression = { $_.Label }}, Type

將“標籤”屬性重命名為“名稱”

然後,當您將其添加到數組中時,所有值都應顯示:

$TestResult_02 = @()

$TestResult_02 += $Test1
$TestResult_02 += $Test2
$TestResult_02 += $Test3 | Select-Object @{ Name = 'Name'; Expression = { $_.Label }}, Type

$TestResult_02

計算屬性顯示所有值

為什麼不是這種方法適合您的場景?

你所有的屬性意味著不同的東西。的Architecture屬性與例如$OSInfo的任何屬性都不匹配。$DiskSpace在這裡使用計算屬性可能最終會及時混淆每個人。

選項 2 - 創建 PSCustomObject(推薦)

建構PSCustomObject類型很容易,特別是如果您像在場景中那樣提前知道命令或變數的輸出。

$ResultObject = [PSCustomObject]@{
   Test1_Name = $Test1.Name
   Test1_Type = $Test1.Type
   Test2_Name = $Test2.Name
   Test2_Type = $Test2.Type
   Test3_Name = $Test3.Label
   Test3_Type = $Test3.Type
}

$ResultObject

使用 PSCustomObject 顯示所有結果

將您的範例與我機器上的資訊一起使用,我們可以創建以下內容PSCustomObject

$FullResults = [PSCustomObject]@{
   ComputerName = $OSInfo.ComputerName
   OSVersion = $OSInfo.OSVersion
   Version = $OSInfo.Version
   Architecture = $OSInfo.Architecture
   InstanceName = $SQLInstanceInfo.DbaInstanceName
   Edition = $SQLInstanceInfo.Edition
   NetPort = $SQLInstanceInfo.NetPort
   IsClustered = $SQLInstanceInfo.IsClustered
   Processors = $SQLInstanceInfo.Processors
   ProductLevel = $SQLInstanceInfo.ProductLevel
   ServiceName = $SQLInstanceInfo.ServiceName
   Disks = $DiskSPace
}

$FullResults

創建 PSCustomObject 的完整結果

引用自:https://dba.stackexchange.com/questions/261924