选择对象上带省略号的空格和截断

时间:2015-07-09 10:31:03

标签: powershell

我试图找出原因Select-Object

  1. 在输出开始时添加了很多空格;和
  2. 使用省略号截断长属性。
  3. 这是我的意思的责备。假设您在C:\上运行这些命令:

    New-Item "MyTest" -Type Directory
    
    cd MyTest
    
    "Some very long lorem ipsum like text going into a certain file, bla bla bla and some more bla." | Out-File test.txt
    
    Get-ChildItem | Select-String "text" | Select-Object LineNumber,Line
    

    这将显示如下输出:

    Select-Object output

    我能理解的省略号,就是当结果写入控制台主机时命令最终被格式化的方式。但是,在这种情况下,开头的空白仍然让我感到困惑。

    当我将结果传递给clipOut-File output.txt时,事情变得更加怪异。我得到了类似格式的输出,在开始时有很多空格和截断的Line属性。

    哪个命令导致了这种行为,我怎样才能正确解决这个问题?最重要的是:如何将完整的结果放入文件或剪贴板?

2 个答案:

答案 0 :(得分:7)

输出数据的默认行为是使用Format-Table而不使用任何修饰符,Format-Table的默认行为是将视口拆分为相等宽度的列。这不假设输出宽度,并且更快,因为cmdlet在输出之前不需要处理来自管道的任何字符串数据。

要减少空白,您应该使用Format-Table -AutoSize作为输出方法。 -AutoSize开关首先测量数据的宽度,然后根据计算的宽度输出。如果您不需要接收省略号并始终显示完整数据集,请将-Wrap切换为Format-Table,这样该值将包含在多行中,但您可以通过选择复制它在Powershell窗口中的一个方形区域,只需从剪切的内容中删除换行符。

Get-ChildItem | Select-String "text" | Select-Object LineNumber,Line | Format-Table -AutoSize -Wrap

答案 1 :(得分:5)

我想说将完整输出转换为文件的最佳方法是将结果导出为CSV:

Get-ChildItem |
  Select-String "text" |
  Select-Object LineNumber,Line |
  Export-Csv 'out.csv'

您还可以从所选属性构建一个字符串,这可能更适合将数据复制到剪贴板:

Get-ChildItem |
  Select-String "text" |
  ForEach-Object { '{0}:{1}' -f $_.LineNumber, $_.Line } |
  Tee-Object 'out.txt' | clip

您观察到的行为是由PowerShell显示输出的方式引起的。基本上,它查看第一个对象并计算属性。属性少于5的对象将发送到Format-Table,否则发送到Format-List。表格输出列均匀分布在可用空间中。正如@Vesper已经提到的那样,您可以使用-AutoSize参数强制执行比例列宽度,并使用-Wrap参数包装长行。 Format-List默认包装长字符串。

有关详细信息,请参阅Jeffrey Snover的this blog post