我试图找出原因Select-Object
这是我的意思的责备。假设您在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
这将显示如下输出:
我能理解的省略号,就是当结果写入控制台主机时命令最终被格式化的方式。但是,在这种情况下,开头的空白仍然让我感到困惑。
当我将结果传递给clip
或Out-File output.txt
时,事情变得更加怪异。我得到了类似格式的输出,在开始时有很多空格和截断的Line
属性。
哪个命令导致了这种行为,我怎样才能正确解决这个问题?最重要的是:如何将完整的结果放入文件或剪贴板?
答案 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。