Результаты фильтра Powershell не совпадают с результатами конвейера - PullRequest
0 голосов
/ 19 марта 2020

Я могу использовать следующие команды для получения желаемого результата без каких-либо пустых строк.

PS C:\> Get-ChildItem $Home | Out-String | ForEach-Object {($_.tostring()).split([Environment]::Newline)} | Where-Object {$_}
    Directory: C:\Users\user
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d-r--        03/04/2019     15:50            Contacts
d-r--        19/03/2020     10:48            Desktop
d-r--        19/03/2020     10:48            Documents
d-r--        03/04/2019     15:50            Downloads
d-r--        03/04/2019     15:50            Favorites
d-r--        03/04/2019     15:50            Links
d-r--        03/04/2019     15:50            Music
d-r--        03/04/2019     15:50            Pictures
d-r--        03/04/2019     15:50            Saved Games
d-r--        03/04/2019     15:50            Searches
d-r--        03/04/2019     15:50            Videos
PS C:\> 

Однако, если я создаю фильтр для выполнения той же работы, он не работает.

PS C:\> filter Strip-Blanks ()
>> {
>>   $input | Out-String | ForEach-Object {($_.tostring()).split([Environment]::Newline)} | Where-Object {$_}
>> }
>>
PS C:\> Get-ChildItem $Home | Strip-Blanks
    Directory: C:\Users\user
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d-r--        03/04/2019     15:50            Contacts
    Directory: C:\Users\user
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d-r--        19/03/2020     10:48            Desktop
    Directory: C:\Users\user
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d-r--        19/03/2020     10:48            Documents
    Directory: C:\Users\user
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d-r--        03/04/2019     15:50            Downloads
    Directory: C:\Users\user
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d-r--        03/04/2019     15:50            Favorites
    Directory: C:\Users\user
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d-r--        03/04/2019     15:50            Links
    Directory: C:\Users\user
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d-r--        03/04/2019     15:50            Music
    Directory: C:\Users\user
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d-r--        03/04/2019     15:50            Pictures
    Directory: C:\Users\user
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d-r--        03/04/2019     15:50            Saved Games
    Directory: C:\Users\user
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d-r--        03/04/2019     15:50            Searches
    Directory: C:\Users\user
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d-r--        03/04/2019     15:50            Videos
PS C:\>

Очевидно, что при передаче результатов из Get-ChildItem в мой фильтр каждый объект (файл / папка) передается отдельно и в итоге отображается с собственным заголовком. Вопрос в том, почему этого не происходит при передаче по выводу через Out-String в первом примере, и могу ли я заставить свой фильтр работать так же?

Спасибо.

1 Ответ

1 голос
/ 20 марта 2020

Это сложно. В первом примере out-string блокируется, пока не будет всех строк. Ваш фильтр должен был бы сделать то же самое. Обратите внимание на задержку до тех пор, пока не будут введены все 3 числа.

& { 1;sleep 1;2;sleep 1;3 } | out-string

Если вы удалите строку из фильтра, она будет работать. Out-String выводит одну многострочную строку.

filter Strip-Blanks {
  $input | 
  ForEach-Object {($_.tostring()).split([Environment]::Newline)} | 
  Where-Object {$_}
 }

Get-ChildItem | Out-String | Strip-Blanks

    Directory: /Users/js/foo
UnixMode   User             Group                 LastWriteTime           Size Name
--------   ----             -----                 -------------           ---- ----
-rw-r--r-- js               staff               3/19/2020 22:59              3 file1
-rw-r--r-- js               staff               3/19/2020 22:59              3 file2
-rw-r--r-- js               staff               3/19/2020 22:59              3 file3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...