Powershell
Powershell dbatools 結合多個 Get-dbaxxx 命令的結果生成報告
我是 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
選項 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
$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