假设我有以下文件,我想从多个目录中删除。
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
,因为在我的实际代码中,我在管道上进行了非平凡的过滤,以选择要删除的文件。答案 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 }