2009-04-18 43 views
1

我在Powershell 1.0中遇到了一件奇怪的事情,我不明白Powershell为什么会这样做。内部逻辑的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: 它,我递给该脚本的图标文件夹下存在。

解决方法是让我将目录切换到图标文件夹并在那里执行命令。

但这不合逻辑。我想能够说在哪个目录中文件应该被删除,然后他们应该只在那里被删除。为什么Powershell开始在当前目录中查找文件对我来说是个谜。

有人可以向我解释这个吗?

回答

8

如果在管道末端取下Remove-Item你会看到,所有返回的路径名是相对于您通过-Path参数输入到Get-ChildItem的路径。因此Remove-Item在当前目录中查找所有路径Get-ChildItem返回。

由于capar建议,-Name参数是这里的问题。删除它确保您获得File对象,其中Remove-Item可以轻松地找到该文件:

Get-ChildItem -Path E:\Webdev\icons\ -Include *.zip -Recurse -Force | Remove-Item -Force 

按预期正常工作。别失望,串级,如果你能解决的对象东西:-)

+0

+1,这确实似乎工作,而且比我的解决方案 – 2009-04-18 06:48:45

3

Get-ChildItem似乎在使用-Name时返回搜索路径后面的路径部分加上文件名。然后将该文件名传送到使用当前目录加上返回的文件名的Remove-Item中。

我尝试使用-FullName该命令,但似乎并没有工作,所以你应该能够管该命令将选择-对象指定全名和管道将进入删除项目。

尝试:

Get-ChildItem -Path E:\Webdev\icons -Include *.zip -Recurse | 
Select-Object -Property FullName | Remove-Item -Force