PowerShell - 如何处理由regex管道选择的文件夹中的文件

时间:2017-10-22 13:43:00

标签: regex powershell pipeline

我使用以下管道选择特定文件夹:

gci -path * | ? { $_.PsIsContainer -and $_.Fullname -notmatch '_' }

上面给出了我的名字中没有下划线的文件夹,这就是我想要的,到目前为止一切都很好。

但是当我将结果传递给另一个Get-ChildItem时,我得到一个 BindingException 错误:

gci -path * | ? { $_.PsIsContainer -and $_.Fullname -notmatch '_' } | gci *.pdf
  

gci:输入对象无法绑定到命令的任何参数,因为该命令不执行   管道输入或输入及其属性与管道输入的任何参数都不匹配。

     

+ CategoryInfo:InvalidArgument :( Book Folder B:PSObject)[Get-ChildItem],ParameterBindingException

     

+ FullyQualifiedErrorId:InputObjectNotBound,Microsoft.PowerShell.Commands.GetChildItemCommand

如何处理上述管道输出的每个文件夹中的文件。例如,如果文件具有pdf扩展名,我想为其调用Move-Item命令。

2 个答案:

答案 0 :(得分:2)

更改最后一个管道对象

来自plt.show()

gci *.pdf

但我建议您使用以下内容优化现有总线:

Get-childitem -Filter *.pdf

答案 1 :(得分:1)

以下代码段输出当前文件夹中 一个级别 下所有.pdf个文件的完全限定名称,这些文件在完整路径。 (输出文件名可以包含下划线)。

Get-ChildItem -Path . | 
  Where-Object { $_.PsIsContainer -and $_.Fullname -notmatch '_' } | 
    Get-ChildItem -Filter *.pdf |
      ForEach-Object { 
        <# do anything with every file object instead of just outputting its FullName <##>
        $_.FullName 
      }

您需要在第二个-Filter中使用gci关键字,其允许位置 2 (请注意, 1 位置是专用的对于-Path参数)。

有关进一步说明和潜在改进/优化的信息,请阅读Get-ChildItem以及Get-ChildItem for FileSystem