Powershell 过滤器结果与管道的结果不匹配
Powershell filter results don't match results from a pipeline
我可以使用以下命令生成没有任何空行的所需输出。
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
的结果通过管道传输到我的过滤器时,每个 (file/folder) object 都被单独传递并最终与它自己的 header 一起显示。问题是为什么在第一个示例中通过 Out-String
管道输出时不会发生这种情况,我能否让我的过滤器以相同的方式运行?
谢谢。
这很棘手。在第一个示例中,out-string 一直处于阻塞状态,直到它包含所有行。您的过滤器也必须这样做。请注意延迟,直到输入所有 3 个数字。
& { 1;sleep 1;2;sleep 1;3 } | out-string
如果你从过滤器中取出字符串,它就会起作用。 Out-String 输出 one 多行字符串。
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
我可以使用以下命令生成没有任何空行的所需输出。
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
的结果通过管道传输到我的过滤器时,每个 (file/folder) object 都被单独传递并最终与它自己的 header 一起显示。问题是为什么在第一个示例中通过 Out-String
管道输出时不会发生这种情况,我能否让我的过滤器以相同的方式运行?
谢谢。
这很棘手。在第一个示例中,out-string 一直处于阻塞状态,直到它包含所有行。您的过滤器也必须这样做。请注意延迟,直到输入所有 3 个数字。
& { 1;sleep 1;2;sleep 1;3 } | out-string
如果你从过滤器中取出字符串,它就会起作用。 Out-String 输出 one 多行字符串。
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