内部逻辑的Powershell问题

Kdg*_*Dev 1 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
Run Code Online (Sandbox Code Playgroud)

然而,在执行时,我得到了一堆错误,所有人都这么说

找不到路径E:\ test.zip,因为它不存在.

实际上,e下没有test.zip这样的文件:它存在于我递给脚本的icons文件夹下.

解决方案是我将目录更改为icons文件夹并在那里执行命令.

但这不符合逻辑.我希望能够说出应该删除文件的目录,然后才能删除它们.为什么Powershell开始在当前目录中查找文件对我来说是一个谜.

请问有人向我解释一下吗?

Joe*_*oey 8

如果删除Remove-Item管道末尾的末尾,您将看到返回的所有路径名都与您通过-Path参数输入的路径相关Get-ChildItem.因此Remove-Item,在当前目录中查找所有路径Get-ChildItem返回.

正如Capar建议的那样,-Name参数是这里的问题.删除它可确保您Remove-Item可以轻松找到可以找到文件的File对象:

Get-ChildItem -Path E:\Webdev\icons\ -Include *.zip -Recurse -Force | Remove-Item -Force
Run Code Online (Sandbox Code Playgroud)

将按预期工作.如果你可以用对象解决问题,请不要达到字符串级别:-)

  • 好吧,该参数告诉cmdlet返回字符串而不是FileInfo对象.Remove-Item非常聪明,可以在获取FileInfo时找出要删除的内容,但是使用字符串时它只能假定一个路径名...并且由于这些是相对于您指定的路径...它只能猜测.-Name参数可能仅用于显示目的; 但是,在管道中使用对象要容易得多. (2认同)