删除powershell输出中的空行。。。通常地
我是PS脚本的新手。 我发现,一般来说,PS在其命令的输出中添加了很多换行符。下面我将给出几个示例,说明我发现PS命令中的(默认?)输出有些通用。 我习惯于类似Unix的输出,其中一般化的输出几乎没有这些行(当然,没有什么可以阻止程序员添加它们) 是否有一种可配置的方法来减少这些换行符的数量,以及可能的冗长程度? 我在下面列出了一系列涉及具体案例的SO问题(以及额外问题),但没有一个是针对一般情况的。 我可以逐个命令应用一些答案,但我想问的是,是否存在某种形式的总体设置/配置PS 编辑: 后来我发现(略有变化)在苏删除powershell输出中的空行。。。通常地,powershell,newline,Powershell,Newline,我是PS脚本的新手。 我发现,一般来说,PS在其命令的输出中添加了很多换行符。下面我将给出几个示例,说明我发现PS命令中的(默认?)输出有些通用。 我习惯于类似Unix的输出,其中一般化的输出几乎没有这些行(当然,没有什么可以阻止程序员添加它们) 是否有一种可配置的方法来减少这些换行符的数量,以及可能的冗长程度? 我在下面列出了一系列涉及具体案例的SO问题(以及额外问题),但没有一个是针对一般情况的。 我可以逐个命令应用一些答案,但我想问的是,是否存在某种形式的总体设置/配置PS 编辑: 后来我
示例 这是我通过几个命令看到的
> 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
向右滚动,可以看到我的评论。
我已将要删除的行标记为“EXTRA LINE
”。
我已经标记了“详细行”
”我想删除的行,但我更愿意“容忍”这些行
作为一个比较点,这就是我在Linux中看到的,我发现它“不那么冗长”
未解决该问题的其他来源列表
您可以定义一个自定义
输出默认值
函数,从输出中删除所有空行/空行(仅用于显示):
您可以将其放在$PROFILE
文件中,以便在以后的所有会话中都可用(使用-NoProfile
调用PowerShell的会话除外)
所有命令都隐式地将此函数用于主机(控制台)输出,因为输出默认值
是PowerShell在后台调用的一个特殊命令,用于处理主机输出(即,对于既不捕获也不管道化也不重定向的输出)
因此,一旦定义了函数,只需调用Get ChildItem
(别名为dir
)就可以生成删除所有空/空白的输出
请注意,捕获/管道化/重定向输出不受影响,这是需要的
注意事项:如上所述,输出默认值
仅影响主机输出,不影响其他基于格式化系统的Out-*
cmdlet的行为,如果需要,您必须单独重新定义这些cmdlet
值得注意的是,重新定义的输出默认值
不会影响输出文件
及其有效别名/>
——有关执行相同空行剥离的自定义输出文件
实现,请参见底部部分
旁白: PowerShell附带一个默认命令,作为cmdlet实现。 虽然您可以直接调用
Out Default
(无论是默认实现还是自定义实现),但没有理由这样做,应该避免这样做-请参阅
正如所指出的,对于给定的命令,您可以临时使用相同的技术;e、 g:
Get-ChildItem | Out-String -Stream | Where { $_.Trim().Length -gt 0 }
但是,请注意,与Out Default
方法不同,此技术仅适用于显示,因为您随后输出的是字符串表示,而不是原始对象(如果您要通过管道将写入主机
,您将完全绕过(成功)输出流)
自定义
输出文件
函数,该函数也会剥离空行/空行,也被
/>
调用:
注:
- 此函数比自定义
函数更复杂,因为它需要支持与原始cmdlet相同的参数Out Default
- 它将明显比原始的
/
/
/
慢,并且它不支持常见的>
和-Confirm
参数(但是很少与-WhatIf
一起使用)Out文件
- 如下文所述,该函数是为在PowerShell[Core]v6+中使用而设计的-请参阅源代码中的注释,了解如何(轻松)将其适应Windows PowerShell
你是否要求所有的读者浏览十个链接,阅读所有关于他们的信息,然后提出一些在所有这些链接中没有提到的建议?要求通用解决方案涵盖所有可能的产出,这是一个不现实的问题。如果您有特定输出的特定问题,我们可以尝试为您提供解决方案。除了基本上重新编程PowerShell,或者编程一个助手应用程序或脚本来获取所有输出,解析它,修改它,然后根据需要输出它之外,您的问题可能是无法回答的。我从未注意到PowerShell中有过多的空行。你能举个例子说明你在哪里看到这个吗?至于详细输出,这取决于您运行的命令(和开关),但PowerShell提供了大量自定义或抑制输出的范围。再一次,你能举一个例子,你有详细的输出,你实际上想看到什么吗?请记住,你在屏幕上看到的不是对象。它是对象的文本表示形式,可以添加和/或删除项目以使显示更具可读性。所以你到底在处理什么问题?是屏幕显示还是实际数据?仅出于显示目的,将所有内容发送到
Out String
和Trim()
多余部分<代码>(命令|输出字符串).Trim()。但是,我不建议更改对象的输出类型。
function Out-Default {
$Input | Out-String -Stream | Where { $_.Trim().Length -gt 0 } | Write-Host
}
Get-ChildItem | Out-String -Stream | Where { $_.Trim().Length -gt 0 }
# 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
}