代码之家  ›  专栏  ›  技术社区  ›  Paolo Tedesco

PowerShell:不带标题的格式表

  •  10
  • Paolo Tedesco  · 技术社区  · 14 年前

    在PowerShell脚本中,我将一些对象传递给 Format-Table CmdLet。
    我的脚本的输出如下所示:

    Something...
    
    Operation AttributeName  AttributeValue
    --------- -------------  --------------
    Delete    Member         John Doe
    
    Something else...
    

    由于字段的含义是非常不言自明的,所以我想从格式表的输出端开始删除标题、“-----”分隔符和空白行。
    我不认为CmdLet支持这一点(或者至少如果有一个参数可以这样做,我找不到它)。

    6 回复  |  直到 12 年前
        1
  •  35
  •   Jay Bazuzi Buck Hodges    14 年前

    试试这个 -HideTableHeaders Format-Table :

    gci | ft -HideTableHeaders
    

        2
  •  10
  •   KERR    6 年前

    -ExpandProperty . 例如,我使用它将clean变量发送到 Out-Gridview -PassThru ,否则该变量将存储头信息。请注意,如果您想要返回多个属性,那么这些不是很好。

    举个例子:

    Get-ADUser -filter * | select name -expandproperty name
    

    或者,您可以这样做:

    (Get-ADUser -filter * ).name
    
        3
  •  8
  •   Joey Gumbo    14 年前

    这个 -HideTableHeaders 不幸的是,参数仍然会导致打印空行(表头似乎仍然被认为是列宽)。我知道,在这里可靠工作的唯一方法是自己格式化输出:

    | % { '{0,10} {1,20} {2,20}' -f $_.Operation,$_.AttributeName,$_.AttributeValue }
    
        4
  •  4
  •   user1769153    7 年前

    下面是我解决这个问题的方法。我只是通过管道将输出传递给Out String,然后将该输出传递给.NET Trim函数:

    (gci | ft -HideTableHeaders | Out-String).Trim()
    

    (gci | ft -HideTableHeaders | Out-String).TrimStart()
    
        5
  •  1
  •   Greg Bray    12 年前

    ForEach-Object 将单个项投影到字符串,然后使用 Out-String

    gci Microsoft.PowerShell.Core\Registry::HKEY_CLASSES_ROOT\CID | foreach { "CID Key {0}" -f $_.Name } | Out-String
    
    #Result: One multi-line string equal to:
    @"
    CID Key HKEY_CLASSES_ROOT\CID\2a621c8a-7d4b-4d7b-ad60-a957fd70b0d0
    CID Key HKEY_CLASSES_ROOT\CID\2ec6f5b2-8cdc-461e-9157-ffa84c11ba7d
    CID Key HKEY_CLASSES_ROOT\CID\5da2ceaf-bc35-46e0-aabd-bd826023359b
    CID Key HKEY_CLASSES_ROOT\CID\d13ad82e-d4fb-495f-9b78-01d2946e6426
    "@
    
    gci Microsoft.PowerShell.Core\Registry::HKEY_CLASSES_ROOT\CID | foreach { "CID Key {0}" -f $_.Name } | Out-String -Stream
    
    #Result: An array of single line strings equal to:
    @(
    "CID Key HKEY_CLASSES_ROOT\CID\2a621c8a-7d4b-4d7b-ad60-a957fd70b0d0",
    "CID Key HKEY_CLASSES_ROOT\CID\2ec6f5b2-8cdc-461e-9157-ffa84c11ba7d",
    "CID Key HKEY_CLASSES_ROOT\CID\5da2ceaf-bc35-46e0-aabd-bd826023359b",
    "CID Key HKEY_CLASSES_ROOT\CID\d13ad82e-d4fb-495f-9b78-01d2946e6426")
    

    这种方法的好处是,您可以将结果存储到变量中,并且它不会有任何空行。

        6
  •  0
  •   Conrad B    12 年前

    长话短说,我的问题很相似,看起来有点像这样

    $verbosepreference="Continue"
    write-verbose (ls | ft | out-string) # this generated too many blank lines
    

    下面是我的例子:

    ls | Out-Verbose # out-verbose formats the (pipelined) object(s) and then trims blanks
    

    我的Out Verbose函数如下所示:

    filter Out-Verbose{
    Param([parameter(valuefrompipeline=$true)][PSObject[]]$InputObject,
          [scriptblock]$script={write-verbose "$_"})
      Begin {
        $val=@()
      }
      Process {
        $val += $inputobject
      }
      End {
        $val | ft -autosize -wrap|out-string |%{$_.split("`r`n")} |?{$_.length} |%{$script.Invoke()}
      }
    }
    

    注2:您仍然可以添加-noheadings选项。 如果您想知道为什么我在这里使用scriptblock,那是为了允许重载,比如发送到磁盘文件或其他输出流。