内部逻辑的Powershell问题

时间:2009-04-18 06:13:29

标签: powershell

我在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开始在当前目录中查找文件对我来说是一个谜。

有人可以向我解释一下吗?

2 个答案:

答案 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