Удалите пустые строки в выводе powershell ... Как правило - PullRequest
0 голосов
/ 10 июля 2020

Я новичок в написании сценариев для PS. Я обнаружил, что, вообще говоря, PS добавляет много новых строк в вывод своих команд. Ниже я привожу несколько примеров того, что я нашел несколько обобщенным относительно вывода (по умолчанию?) В командах PS. Я привык к Unix -подобному выводу, где в обобщенном выводе почти нет этих строк (конечно, ничто не мешает программисту добавить их).

Есть ли настраиваемый способ уменьшить количество этих новых строк и, возможно, многословность?

Ниже я составил список вопросов SO (и дополнительных), касающихся конкретных c случаев, но ни один из них не нацелен на общую настройку. Я мог бы применить некоторые ответы по отдельности, но я спрашиваю, есть ли какая-то форма общей настройки / настройки PS.

EDIT : Позже я обнаружил аналогичный вопрос (с небольшими вариациями) в SU.


Примеры

Это то, что я вижу с помощью пары команд

> 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". Я пометил «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. Удалить пустые строки в PowerShell вывод
  2. Удаление пустых строк Вывод Powershell
  3. Удаление пустых строк из вывода Powershell
  4. Как сделать удалить лишние строки из вывода Get-WMIObject PowerShell
  5. Удалить пустые строки из вывода?
  6. Удалить пустое пространство из вывода в PowerShell
  7. Удалить пустые строки из вывода Powershell
  8. Удаление лишнего пустого пространства из вывода PowerShell
  9. Удалить пустые строки из выход
  10. https://social.technet.microsoft.com/Forums/en-US/229727f6-fdb6-4d95-b585-bd9af3ee6670/removing-blank-spaces-and-blank-lines-from-output?forum=ITCG

1 Ответ

3 голосов
/ 10 июля 2020

Вы можете определить настраиваемую 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

}
...