我想弄明白为什么 Select-Object
这是我的意思的责备.假设您运行以下命令C:\:
New-Item "MyTest" -Type Directory
Run Code Online (Sandbox Code Playgroud)
cd MyTest
Run Code Online (Sandbox Code Playgroud)
"Some very long lorem ipsum like text going into a certain file, bla bla bla and some more bla." | Out-File test.txt
Run Code Online (Sandbox Code Playgroud)
Get-ChildItem | Select-String "text" | Select-Object LineNumber,Line
Run Code Online (Sandbox Code Playgroud)
这将显示如下输出:

我可以理解的省略号,就是当结果写入控制台主机时命令最终被格式化的方式.但是,在这种情况下,开始时的空白仍然让我感到困惑.
当我把结果输送到其中一个clip或者时,事情对我来说更加怪异Out-File output.txt.我得到类似格式的输出,在开始时有很多空格和截断Line属性.
哪个命令导致了这种行为,我该如何正确解决这个问题呢?最重要的是:如何将完整结果存入文件或剪贴板?
输出数据的默认行为是在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
Run Code Online (Sandbox Code Playgroud)
我想说将完整输出转换为文件的最佳方法是将结果导出为CSV:
Get-ChildItem |
Select-String "text" |
Select-Object LineNumber,Line |
Export-Csv 'out.csv'
Run Code Online (Sandbox Code Playgroud)
您还可以从所选属性构建一个字符串,这可能更适合将数据复制到剪贴板:
Get-ChildItem |
Select-String "text" |
ForEach-Object { '{0}:{1}' -f $_.LineNumber, $_.Line } |
Tee-Object 'out.txt' | clip
Run Code Online (Sandbox Code Playgroud)
您观察到的行为是由PowerShell显示输出的方式引起的.基本上,它查看第一个对象并计算属性.发送少于5个属性的对象Format-Table,否则发送到Format-List.表格输出列均匀分布在可用空间中.正如@Vesper已经提到的那样,您可以通过使用-AutoSize参数强制比例列宽度,并使用参数包装长行-Wrap.Format-List默认情况下包装长字符串.
有关更多信息,请参阅Jeffrey Snover的这篇博客文章.
| 归档时间: |
|
| 查看次数: |
2617 次 |
| 最近记录: |