我在Powershell 1.0中有一个奇怪的事情,我不明白Powershell为什么会这样做。
情况:我通过字母e:
在驱动器上创建了几个zip文件现在我想删除它们。但是我的e:驱动器上有更多的zip文件。所以我想只删除这个特定文件夹及其子文件夹中的那些文件。
我想要使用的命令是:
PS E:\> Get-ChildItem -Path E:\Webdev\icons\ -Include *.zip -Recurse -Name -Force | Remove-Item -Force
然而,在执行时,我得到了一堆错误,都说
无法找到路径E:\ test.zip因为 它不存在。
实际上,e下没有test.zip这样的文件: 它存在于我递给脚本的图标文件夹下。
解决方案是我将目录更改为icons文件夹并在那里执行命令。
但这不符合逻辑。我希望能够说出应该删除文件的目录,然后才能删除它们。为什么Powershell开始在当前目录中查找文件对我来说是一个谜。
有人可以向我解释一下吗?
答案 0 :(得分:8)
如果删除管道末尾的Remove-Item
,您将看到返回的所有路径名都是相对于您通过-Path
参数输入到Get-ChildItem
的路径。因此,Remove-Item
在当前目录中查找所有路径Get-ChildItem
返回。
正如Capar建议的那样,-Name
参数就是问题所在。删除它可确保您获得Remove-Item
可以轻松找到文件的文件对象:
Get-ChildItem -Path E:\Webdev\icons\ -Include *.zip -Recurse -Force | Remove-Item -Force
将按预期工作。如果你能用对象解决问题,请不要达到字符串级别: - )
答案 1 :(得分:3)
Get-ChildItem似乎返回搜索路径后面的路径部分以及使用-Name时的文件名。然后将此文件名传送到Remove-Item,它使用当前目录和返回的文件名。
我使用-FullName尝试了这个命令,但这似乎不起作用,所以你应该能够将该命令传递给Select-Object,以指定进入Remove-Item的全名和管道。
尝试:
Get-ChildItem -Path E:\Webdev\icons -Include *.zip -Recurse |
Select-Object -Property FullName | Remove-Item -Force