我的递归删除有什么问题?

时间:2014-03-25 03:09:16

标签: powershell delete-file

Get-ChildItem -recurse | ? {$_.Extension -eq ".obj" } | %{del $_}
                                                           ~~~~~~
CategoryInfo          : ObjectNotFound: (C:\Temp\compilerLimits\template.obj:String)    [Remove-Item], ItemNotFoundException
FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.RemoveItemCommand

尝试递归删除所有.obj文件; 相反,我得到了这个。

1 个答案:

答案 0 :(得分:5)

试试这样:

Get-ChildItem -recurse *.obj | Remove-Item

对于| %{del $_}$_是System.IO.FileInfo对象,当PowerShell将其用于LiteralPath参数时,它会看到LiteralPath参数采用字符串。将FileInfo转换为字符串似乎使用FileInfo.ToString()方法,在某些情况下(如子目录)并不包含完整路径 - 只包含文件名。这将导致您看到的错误。在FileInfo对象中进行管道传输时,将使用管道参数绑定规则。 LiteralPath参数有一个名为PSPath的别名。 PowerShell的类型系统将此属性添加到每个FileInfo对象。您可以使用Get-ChildItem *.obj | Get-Member查看此信息。由于LiteralPath参数将ValueFromPipelineByPropertyName设置为true,因此PowerShell将从对象的PSPath属性中获取参数值。

您可以在Item 8 of my Effective PowerShell ebook中了解详情。