ItemNotFoundException在curent目录之外的文件上从管道调用Remove-Item

时间:2015-07-13 02:17:14

标签: powershell

假设我有以下文件,我想从多个目录中删除。

PS d:\path> $files = gci -path . -Recurse -File

PS d:\path> $files
d:\path\foo.txt
d:\path\sub\bar.txt

我使用foreach来致电Remove-Item

PS d:\path> $files | foreach { Remove-Item -Path $_ -WhatIf }
What if: Performing the operation "Remove File" on target "D:\path\foo.txt".
Remove-Item : Cannot find path 'D:\path\bar.txt' because it does not exist.
At line:1 char:19
+ $files | foreach { Remove-Item -Path $_ -WhatIf }
+                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (D:\path\bar.txt:String) [Remove-Item], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.RemoveItemCommand

似乎在传递递归文件列表时,Remove-Item总是尝试从当前目录中删除文件。它可以删除 d:\ path \ foo.txt 就好了。但它尝试删除 d:\ path \ bar.txt 时抛出错误,因为没有这样的文件。它应该删除的文件位于 d:\ path \ sub \ bar.txt

请注意,以下代码可以正常工作,大概是因为Get-ChildItem不是递归的。

PS D:\path> del .\sub\bar.txt -WhatIf
What if: Performing the operation "Remove File" on target "D:\path\sub\bar.txt".

PS D:\path> gci .\sub\bar.txt | % { del $_ -WhatIf }
What if: Performing the operation "Remove File" on target "D:\path\sub\bar.txt".

这是PowerShell中的错误,还是我没有正确使用它?是否有不同的规定方式来递归删除文件,受管道过滤?

其他说明:

  • 包含-WhatIf参数不会影响此处的问题;它只是强制Remove-Item打印输出而不是删除我的测试文件。
  • 我无法将-Recurse传递给Remove-Item,因为在我的实际代码中,我在管道上进行了非平凡的过滤,以选择要删除的文件。
  • 这是Windows 8.1上的Powershell v4.0

2 个答案:

答案 0 :(得分:4)

您可以使用:

,而不是使用foreach-object
$files | Remove-Item  -WhatIf 

$ files返回类型为System.IO.FileSystemInfo

的对象

如果你跑:

help Remove-Item -Parameter path

你会看到path参数接受一个字符串数组。 $files[0].gettype()不是字符串,因此必须进行某种类型转换

答案 1 :(得分:1)

$files | foreach { Remove-Item -Path $_.FullName -WhatIf }