在一行中的两个相邻行上使用 Select-Object 输出一个 "broken" 列表

Using Select-Object on two adjacent lines in a row outputs a "broken" list

考虑以下示例:

if ([Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") -eq $null) {return}
$server = New-Object Microsoft.SqlServer.Management.Smo.Server servername
$server | Select Name, Product, Edition, VersionString 
$server.Databases | select name,CompatibilityLevel

如果在命令行上逐行执行,输出将类似于以下内容:

Name                                     Product                                  Edition                                 VersionString                          
----                                     -------                                  -------                                 -------------                          
SERVERNAME                               Microsoft SQL Server                     Developer Edition (64-bit)              12.0.4213.0                            

Name                                                                     CompatibilityLevel
----                                                                     ------------------
Database123456789                                                                Version100
Database234567890                                                                Version100

如果作为脚本执行,输出如下所示(注意缺少的 "Version100"...):

Name                                     Product                                  Edition                                 VersionString                          
----                                     -------                                  -------                                 -------------                          
SERVERNAME                               Microsoft SQL Server                     Developer Edition (64-bit)              12.0.4213.0                            
Database123456789                                                                                                                                                
Database234567890

即使像这样更改脚本也无助于输出混乱。

if ([Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") -eq $null) {return}
$server = New-Object Microsoft.SqlServer.Management.Smo.Server servername
$server | Select Name, Product, Edition, VersionString 
Write-Host "Databases on $($server.Name):"
$server.Databases | select name,CompatibilityLevel

相反,输出将如下所示:

Name                                     Product                                  Edition                                 VersionString                          
----                                     -------                                  -------                                 -------------                          
SERVERNAME                               Microsoft SQL Server                     Developer Edition (64-bit)              12.0.4213.0                            
Databases on SERVERNAME:
Database123456789                                                                                                                                                
Database234567890

如何强制 PowerShell 输出 CompatibilityLevel 成员?

您可以使用 Format-Table cmdlet 强制输出:

$server.Databases | select name,CompatibilityLevel | Format-Table