32

我需要一些有关以下脚本输出的帮助,因此输出不会显示为省略号 (...)。我试图插入| Format-Table -Wrap -AutoSize,但似乎无法正确插入。

 clear-host Add-PSSnapin microsoft.sharepoint.powershell -ErrorAction SilentlyContinue    
 $services = new-object system.collections.sortedlist
 $servers = (get-spfarm).servers  
 foreach ($server in $servers) {
     foreach($service in $server.serviceinstances)
     {
         if ($service.status = "Online")
         {
             $s = $service.typename
             if ($services.contains($s))
             {
                 $serverlist = $services[$s]
                 $servername = $server.name 
                 $services[$s]  = "$serverlist - $servername"
             }
             else
             {
                 $services[$s] = $server.name
             }
         }
     } } 
  $services

输出:

Name                            Value                                                                           
----                           -----                                                                           
Access Database Service        SE5APP - SE5FE - SE7FE - FAQ3                                          
Application Discovery **and L...** SE5APP - SE5FE - SE7FE - FAQ3                                          
Application Registry Service   SE5APP - SE5FE - SE7FE - FAQ3                                          
4

3 回答 3

35

( ) 或Format-List( )在这里应该有所帮助。flFormat-Table -autoft -auto

$services | fl

或者

$services | ft -auto
于 2012-12-06T02:13:58.933 回答
25

我遇到了这篇文章并想添加一些信息,因为接受的解决方案没有解决我的问题,我相信其他人可能会发现以下信息有用:

快速故事Microsoft Online Services Module:使用with运行命令Powershell,许多结果被不断检索为截断数据截断并丢失为省略号 (...)。

解决方法:正如Greig 在这篇文章中所解释的,我不可避免地得出结论$FormatEnumerationLimit=-1是该问题的无限解决方案。使用Format-Wide, Format-List, Format-Table, Format-Custom, -AutoSize,Out-String -Width等的任何变体都需要大量的额外注意事项/代码。如果您只想查看返回的所有数据,而不管列、数组等如何,$FormatEnumerationLimit=-1确保您将获得所有信息,而无需乱七八糟。

Greig 的帖子中提到的其他信息包括:

PowerShell 快速提示:使用 PowerShell 创建宽表,作者在其中解释:

如果您有一个包含项目集合的特定属性,如果该集合中的项目数超过分配给内置$FormatEnumerationLimit变量的数量,则该属性可能仍会在此处生成的文件中显示省略号。

...并且“将结果传递给| Format-Table -Property *[将] 显示所有列。” 但是列中的内容可能仍会被截断(“PowerShell 默认截断表格输出”),并且即使使用| Format-Table -Property * -AutoSize也会受到屏幕缓冲区的限制(“自动调整大小的表格受限于屏幕缓冲区的宽度”)。在绝对$FormatEnumerationLimit=-1之前提供的解决方案似乎与您需要的任何宽度| Format-Table -Property * -AutoSize结合使用。| Out-String -Width 4096

使用格式命令更改输出视图Format cmdlets: Format-WideFormat-ListFormat-Table.

于 2015-07-14T15:54:45.167 回答
0

在这种情况下,我要做的是创建格式描述,然后将其用作我的 Format-Table 命令的参数。我开发了一个函数 (Get-MaxLength) 来检查具有最长数据的数据字段(有助于在格式描述的末尾使用它)并使用它返回的值设置格式描述中的宽度。您可以在下面的代码中看到计算。注意 Intel(4) 管理引擎接口的 Number 值。还要注意在 Format-Table 命令上使用 -Wrap。可以修改此概念以计算所有字段宽度或仅计算最后一个字段宽度,这只是一个小数学。

Function Get-MaxLength {

<#
.SYNOPSIS
   Finds the length of the longest item in collection.

.DESCRIPTION
   Use this Function to get the length of the longest item in a
   collection for use in format strings or other places where
   needed.

.PARAMETER TestObj
    The qualified object to be tested. See example!

.Parameter MinLen
    The minimum length of the item (if using for formatting) which
    should be the Label (title) length. Note if the object item
    being tested does not have a Length property you MUST specify
    the label length!

.OUTPUTS
    Returns a numerical value

.EXAMPLE
   $NameLen = Get-MaxLength -TestObj $DotNet.PSChildName
   $VerLen  = Get-MaxLength -TestObj $DotNet.Version
   $RNLen   = Get-MaxLength -TestObj $DotNet.Release -MinLen 11

     #--- .Net Information ---

 $fmtDotNet =
  @{Expression={$_.PSChildName};Label=".Net Type";Width=$NameLen},
  @{Expression={$_.Version};Label="Version No:";Width=$VerLen},
  @{Expression={$_.Release};Label="Release No:";Width=$RNLen}

  $Dotnet | Format-Table $fmtDotNet
#>

  Param(
    [Parameter(Mandatory=$True)]
     [object] $TestObj,
    [Parameter(Mandatory=$False)]
     [int] $MinLen = 0,
    [Parameter(Mandatory=$False)]
     [int] $MaxLen = 0
  )

   $ErrorActionPreference = "SilentlyContinue"

   foreach ($x in $TestObj) {
     If ($x.Trim().length -gt $MinLen) {
       $MinLen = $x.Trim().length
     }
   }

   If ($MaxLen -ne 0) {
     If ($MinLen -gt $MaxLen) {
       $MinLen = $MaxLen
     }
   }

   $ErrorActionPreference = "Continue"

   Return ,$MinLen

} #End Function -----------  Get-MaxLength  -------------------

  $OstrWidth = 80
  
  $DriverInfo =
  Get-CimInstance -ClassName 'Win32_PNPSignedDriver'         |
  Where-Object -Property DriverProviderName  -ne "Microsoft" |
  Where-Object -Property DeviceName -ne -Value $Null         |
  Sort-Object  -Property DeviceName -Unique

$DriverCnt = $DriverInfo.Count

  $DVLen =
    Get-MaxLength -TestObj $DriverInfo.DriverVersion -MinLen 14
  $DDLen = $OstrWidth - $DVLen

  $fmtDRVR = @{Label="`nDriver Description";Width=$DDLen;
                                 Expression={$_.DeviceName}},
             @{Label="Version Number";    Width=$DVLen;
                                 Expression={$_.DriverVersion}}

  $DrvTitle = "$($DriverCnt) Non-Windows Unique Drivers and " +
              "Version Numbers:" | Out-String

  $DriverInfo =
    $DriverInfo | Format-Table -Property $fmtDRVR -Wrap |
                  Out-String   -Width $OStrWidth

样本输出:

Driver Description                                                 Number
-------------------                                                -------------
Alcor Micro USB 2.0 Card Reader                                    2.0.150.10135
ASMedia USB3.1 eXtensible Host Controller                          1.16.42.1
...
Intel(R) HD Graphics 630                                           21.20.16.4550
Intel(R) Management Engine Interface                               1914.12.0.125
                                                                   6
Intel(R) Ready Mode Technology Device                              1.2.0.0
...
Realtek Audio                                                      6.0.1.8248
Samsung NVMe Controller                                            3.0.0.1802
于 2020-09-24T22:27:54.963 回答