Вы можете определить настраиваемую Out-Default
функцию , которая удаляет все пустые / пустые строки из вывода (только для отображения):
function Out-Default {
$Input | Out-String -Stream | Where { $_.Trim().Length -gt 0 } | Write-Host
}
Вы можете поместить ее в свой $PROFILE
, который будет доступен во всех будущих сеансах (кроме тех, где PowerShell вызывается с помощью -NoProfile
).
Все команды неявно используют эту функцию для to- host (console) output , потому что Out-Default
- это специальная команда, которую PowerShell вызывает за кулисами для обработки вывода на хост (то есть для вывода, который не захватывается и не передается по конвейеру)
Следовательно, как только функция была определена, простой вызов Get-ChildItem
(который имеет псевдоним dir
), например, должен привести к выводу с удалением всех пустых / пробелов.
Обратите внимание, что захват / конвейерная передача / перенаправление вывода не влияет , что желательно .
Предостережение : Как указано, Out-Default
влияет только на вывод to- host , но не на beh avior других систем форматирования на основе Out-*
командлетов , которые при желании вам придется переопределить отдельно.
Примечательно, что переопределенный Out-Default
делает не влиять на Out-File
и его эффективные псевдонимы >
/ >>
- см. нижний раздел для пользовательской реализации Out-File
, которая выполняет такое же удаление пустых строк.
Кстати: PowerShell поставляется с командой Out-Default
по умолчанию, реализованной как командлет. Хотя вы можете вызвать Out-Default
напрямую (независимо от того, является ли реализация по умолчанию или пользовательская), для этого нет причин, и этого следует избегать - см. этот ответ .
Как указывает Compo , вы можете использовать тот же метод ad ho c для данной команды; например:
Get-ChildItem | Out-String -Stream | Where { $_.Trim().Length -gt 0 }
Однако обратите внимание, что - в отличие от подхода Out-Default
- этот метод подходит только для отображения , потому что тогда вы выводите строковые представления , а не исходные объекты (и если бы вы перешли к Write-Host
, вы бы полностью обошли (успешный) выходной поток).
Пользовательская функция Out-File
, которая также удаляет пустые / пустые строки и также вызывается >
/ >>
:
Примечание:
Эта функция более сложна, чем пользовательская функция Out-Default
, поскольку она должна поддерживать те же параметры, что и исходный командлет.
Это будет заметно медленнее , чем исходный Out-File
/ >
/ >>
, и он не поддерживает общие параметры -Confirm
и -WhatIf
(которые, однако, редко используются с Out-File
).
Как показано ниже, функция предназначена для использования в PowerShell [Core] v6 + - см. Комментарии в исходном коде, чтобы узнать, как (легко) адаптировать ее к Windows PowerShell .
# 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
}