首页 > 解决方案 > Powershell 过滤器结果与管道中的结果不匹配

问题描述

我可以使用以下命令生成所需的输出而无需任何空行。

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我可以让我的过滤器以相同的方式运行吗?

谢谢你。

标签: powershellpowershell-2.0

解决方案


这很棘手。在第一个示例中,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

推荐阅读