Powershell筛选器结果不';无法匹配管道中的结果

Powershell筛选器结果不';无法匹配管道中的结果,powershell,powershell-2.0,Powershell,Powershell 2.0,我可以使用以下命令生成所需的输出,无需任何空行 PS C:\> Get-ChildItem $Home | Out-String | ForEach-Object {($_.tostring()).split([Environment]::Newline)} | Where-Object {$_} Directory: C:\Users\user Mode LastWriteTime Length Name ----

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

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
时,为什么不发生这种情况,我可以让我的过滤器以相同的方式工作吗


多谢各位

这很棘手。在第一个示例中,out字符串一直阻塞,直到它拥有所有行。您的过滤器也必须这样做。请注意延迟,直到输入所有3个数字

& { 1;sleep 1;2;sleep 1;3 } | 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

这很棘手。在第一个示例中,out字符串一直阻塞,直到它拥有所有行。您的过滤器也必须这样做。请注意延迟,直到输入所有3个数字

& { 1;sleep 1;2;sleep 1;3 } | 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

Out-String
cmdlet通常会向其输出的每个字符串添加一个换行符。你有没有试过不使用它?PoSh通常会尝试为您分组……只需执行
获取ChildItem$Home
。这就是全部。不要试图将这个FileInfo和DirectoryInfo对象数组强制成一个字符串,然后以某种方式将其重新拆分为一个表。如果我省略了
out string
,我只会得到一个文件夹和文件名列表,而没有属性列标题等。我试图实现的是一个过滤器,我可以在任何地方使用它来删除输出流中的空行。我或多或少地实现了我想要的,但我仍然不明白为什么它的行为与第一个示例中本质上相同的行为不同,这让我很恼火。
Out String
cmdlet通常会向它输出的每个字符串添加一个换行符。你有没有试过不使用它?PoSh通常会尝试为您分组……只需执行
获取ChildItem$Home
。这就是全部。不要试图将这个FileInfo和DirectoryInfo对象数组强制成一个字符串,然后以某种方式将其重新拆分为一个表。如果我省略了
out string
,我只会得到一个文件夹和文件名列表,而没有属性列标题等。我试图实现的是一个过滤器,我可以在任何地方使用它来删除输出流中的空行。我或多或少地实现了我想要的,但我仍然不明白为什么它的行为与第一个例子中本质上相同的东西不同,这让我很烦。。