【问题标题】:Remove blank lines in powershell output... Generally删除powershell输出中的空行...一般
【发布时间】:2020-10-31 03:06:05
【问题描述】:

我是 PS 脚本的新手。 我发现,一般来说,PS 在其命令的输出中添加了很多换行符。我在下面给出几个例子,说明我发现 PS 命令中的(默认?)输出有些概括。 我习惯了类 Unix 的输出,一般的输出几乎没有这些行(当然,没有什么能阻止程序员添加它们)。

是否有一种可配置的方式来减少这些换行符的数量,也许还有冗长?

我在下面编制了一个处理特定案例的 SO 问题(以及其他问题)列表,但没有一个针对一般环境。 我可以逐个命令地应用一些答案,但我想问是否存在某种形式的整体设置/配置 PS。

编辑: 后来我在 SU 中找到了this similar question(略有不同)。


示例

这是我通过几个命令看到的

> dir
                                                                                                    ******  EXTRA LINE
                                                                                                    ******  EXTRA LINE
    Directorio: C:\Users\USER1\OneDrive - YPF\Documents\soft-hard-ware\windows\powershell           ******  VERBOSITY LINE
                                                                                                    ******  EXTRA LINE
                                                                                                    ******  EXTRA LINE
Mode                LastWriteTime         Length Name                                               ******  VERBOSITY LINE
----                -------------         ------ ----                                               ******  VERBOSITY LINE
-a----         9/7/2020     17:11           1021 exec_powershell_info.txt
-a----         9/4/2016     08:25            281 first_bytes.ps1
-a----        10/7/2020     07:53           1536 get_current_script_name.ps1
-a----         9/7/2020     11:58             29 hello_world.ps1
-a----         9/4/2016     09:02            344 last_bytes.ps1
-a----        14/4/2016     13:08            975 split.ps1
-a----        10/7/2020     07:54           3108 update-help.txt
                                                                                                    ******  EXTRA LINE
                                                                                                    ******  EXTRA LINE
> Get-Culture
                                                                                                    ******  EXTRA LINE
LCID             Name             DisplayName                                                       ******  VERBOSITY LINE
----             ----             -----------                                                       ******  VERBOSITY LINE
11274            es-AR            Español (Argentina)                                                                  
                                                                                                    ******  EXTRA LINE
                                                                                                    ******  EXTRA LINE

向右滚动,可以看到我的 cmets。 我已经标记了“EXTRA LINE”我要删除的行。 我已经标记了“VERBOSITY LINE”我要删除的行,但我有点“容忍”更多。

作为一个比较点,这是我在 Linux 中看到的,我发现它“不那么冗长”。

$ ll
total 12K
drwxrwxr-x  2 santiago santiago 4,0K ago 10  2017 ./
drwxrwxr-x 17 santiago santiago 4,0K may 19 10:28 ../
-rwxrwxr-x  1 santiago santiago  557 ago 10  2017 date2str.rb*

未解决问题的其他来源列表

  1. Remove blank lines in powershell output
  2. Remove blank lines Powershell output
  3. Removing Blank Lines From Powershell Output
  4. How to remove extra lines from Get-WMIObject output powershell
  5. Remove blank lines from output?
  6. Remove Blank Space From Output in PowerShell
  7. Remove Empty Lines From Powershell Output
  8. Removing extra blank space from PowerShell output
  9. Remove blank lines from the output
  10. https://social.technet.microsoft.com/Forums/en-US/229727f6-fdb6-4d95-b585-bd9af3ee6670/removing-blank-spaces-and-blank-lines-from-output?forum=ITCG

【问题讨论】:

  • 你是不是要求所有的读者访问十个链接,阅读所有关于他们的信息,然后提出一些在所有这些中都没有提到的东西?要求通用解决方案涵盖所有可能的输出并不是一个现实的问题。如果您对特定输出有特定问题,我们可以尝试为您提供解决方案。除了本质上重新编程 PowerShell,或者编写一个辅助应用程序或脚本来获取所有输出、解析、修改然后根据需要输出之外,您的问题可能无法回答。
  • 我从未注意到 PowerShell 中有过多的空行。你能举例说明你在哪里看到这个吗?至于详细输出,这取决于您运行的命令(和开关),但 PowerShell 提供了很多自定义或抑制它的范围。再次,您能否举一个示例,其中您有详细的输出以及您实际希望看到的内容?
  • 请记住,您在屏幕上看到的不是对象。它是对象的文本表示,并且可能添加和/或删除项目以使显示易于阅读。所以... 您正在处理什么确切的问题?是屏幕显示还是实际数据?
  • 仅出于展示目的,将所有内容发送至Out-StringTrim() 多余部分。 (Command | Out-String).Trim()。但是,我不建议更改对象的输出类型。我会照原样接受它。
  • select-string pattern | % line

标签: powershell newline


【解决方案1】:

您可以定义一个自定义Out-Default 函数,从输出中删除所有空行/空白行(仅用于显示):

function Out-Default { 
  $Input | Out-String -Stream | Where { $_.Trim().Length -gt 0 } | Write-Host
}

您可以将它放在您的 $PROFILE 文件中,以便在以后的所有会话中都可用(除了那些使用 -NoProfile 调用 PowerShell 的会话)。

所有命令隐式使用此函数进行到主机(控制台)输出,因为Out-Default是PowerShell调用的特殊命令幕后用于处理到主机的输出(即,既不捕获也不通过管道传送或重定向的输出)。

因此,一旦定义了函数,只需调用 Get-ChildItem(别名为 dir),例如,应该会产生删除所有空/空白的输出。

请注意,捕获/管道/重定向输出受到影响,这是理想的

警告:如上所述,Out-Default 仅影响 to-host 输出,不影响其他基于格式化系统的 Out-* cmdlet 的行为,如果需要,您必须单独重新定义。

值得注意的是,重新定义的Out-Default 不会影响Out-File 及其有效别名> / >> - 请参阅底部部分 用于执行相同的空行剥离的自定义 Out-File 实现。


顺便说一句: PowerShell 附带一个默认的Out-Default 命令,以 cmdlet 的形式实现。 虽然您可以直接调用Out-Default(无论是默认实现还是自定义实现),但没有理由这样做,应该避免这样做 - 请参阅this answer


正如Compo 指出的那样,对于给定的命令,您可以使用相同的技术ad hoc;例如:

Get-ChildItem | Out-String -Stream | Where { $_.Trim().Length -gt 0 }

但是请注意,与 Out-Default 方法不同的是,此技术仅适用于显示,因为您随后会输出字符串表示 而不是原始对象(如果您要通过管道传输到 Write-Host,您将完全绕过(成功)输出流)。


自定义Out-File 函数也去除空行/空白行,也被> / >> 调用

注意:

  • 这个函数比自定义的Out-Default函数更复杂,因为它需要支持与原始cmdlet相同的参数。

  • 它会比原来的Out-File/>/>>明显,并且它不支持常见的-Confirm-WhatIf参数(很少但是,与Out-File 一起使用)。

  • 如下所示,该函数专为在 PowerShell [Core] v6+ 中使用而设计 - 请参阅源代码中的 cmets,了解如何(轻松)使其适应 Windows PowerShell em>。

# Note: Supports neither -Confirm nor -WhatIf
function Out-File {
  [CmdletBinding(DefaultParameterSetName = 'ByPath', HelpUri = 'https://go.microsoft.com/fwlink/?LinkID=2096621')]
  param(
    [Parameter(ParameterSetName = 'ByPath', Mandatory, Position = 0)]
    [Alias('Path')]
    [string] $FilePath,
  
    [Parameter(ParameterSetName = 'ByLiteralPath', Mandatory, ValueFromPipelineByPropertyName)]
    [Alias('PSPath', 'LP')]
    [string]
    $LiteralPath,
  
    [Parameter(Position = 1)]
    # Note: This validation set is for PowerShell *Core* (v6+).
    # For Windows PowerShell support, comment out the the next line and uncomment the one after.
    [ValidateSet('ascii','bigendianutf32','unicode','utf8','utf8NoBOM','bigendianunicode','oem','utf7','utf8BOM','utf32')]
    # [ValidateSet('default', 'ascii','bigendianutf32','unicode','utf8','bigendianunicode','oem','utf7','utf32')]
    [string] $Encoding,
  
    [switch] $Append,
  
    [switch] $Force,
  
    [Alias('NoOverwrite')]
    [switch] $NoClobber,
  
    [ValidateRange(2, 2147483647)]
    [int] $Width,
  
    [switch] $NoNewline,
  
    [Parameter(ValueFromPipeline = $true)]
    [psobject] $InputObject
  )
  
  $null = $PSBoundParameters.Remove('InputObject')

  $Input | Out-String -Stream | Where-Object { $_.Trim().Length -gt 0 } | 
    Microsoft.PowerShell.Utility\Out-File @PSBoundParameters

}

【讨论】:

  • 有趣的一点...当我使用例如Get-Module -ListAvailable > modules.txt 重定向输出时,不会修剪额外的换行符。
  • jdhitsolutions.com/blog/powershell/3025/… 可能在这里感兴趣。 PS还是要懂很多...
  • 有趣的点#2...我在profile.ps1 的顶部添加了您的功能,效果很好。现在我在下面添加了$Host 几行,启动了一个新控制台,$Host 的输出没有修剪换行符。
  • @sancho.sReinstateMonicaCellio:那是我的错:正如答案所述,Out-Default 仅涵盖 to-host 输出; >Out-File 的有效别名,受到影响(其他Out-* cmdlet 也不受影响,例如Out-String);简而言之:您还必须为Out-File 编写一个包装器;虽然看起来如果您希望 > / >> 也尊重这一点,但您必须编写一个代理(包装器)函数 - 请参阅 this answer
  • 我会试试这个,只要我有任何值得评论的地方就会回来。这段代码远远超出了我对 PS 的最基本知识。
猜你喜欢
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
相关资源
最近更新 更多