首页 > 解决方案 > 不存在的文件夹上的 PowerShell Get-ChildItem 与 -recurse 标志的行为不同

问题描述

我正在测试一个 Power Shell 脚本来清理一个文件夹,当我使用 -recurse 标志时,我注意到了一些意想不到的(对我来说)行为

我已经阅读了帮助文件并进行了一些搜索,但无法找到这里发生的事情的解释。

考虑以下 3 个 Power Shell 命令:

 Get-ChildItem -Path  C:\folderThatDoesNotExist -recurse

 Get-ChildItem -Path  C:\folderThatDoesNotExist\ -recurse

 Get-ChildItem -Path  C:\folderThatDoesNotExist\* -recurse

第一个命令似乎搜索所有 C:\ 并且对于 C:\folderThatDoesNotExist 之外的文件夹(例如 c:\windows)有一堆拒绝访问错误

c:\f 的第二个错误不存在

未找到 c:\folderThatDoesNotExist\ 的第三个错误

我希望所有 3 都给出 c:\folderThatDoesNotExist\ Path not found 的错误。为什么前两个给出不同的错误?

标签: powershellget-childitem

解决方案


第一个命令:Get-ChildItem -Path C:\folderThatDoesNotExist -recurse

您看到对cmd.exe'sdir命令的不幸点头,其中-Path参数的最后一个路径组件被解释为要在子树层次结构的所有级别上搜索的模式- 即使最后一个组件包含通配符,例如和。*?

此GitHub 问题中讨论了这种高度成问题的行为。

为避免这种情况,请使用-LiteralPath代替-Path.
警告user3608068报告这在 PowerShell v4 (可能还有所有较低版本)中没有帮助。


第二条命令:Get-ChildItem -Path C:\folderThatDoesNotExist\ -recurse

该行为更明智 - 发生错误 - 但错误消息仅抱怨路径的一部分C:\f.

这本身就是一个错误,但却是无害的(如果您省略-Recurse,错误消息会引用正确的完整路径)。


第三条命令:Get-ChildItem -Path C:\folderThatDoesNotExist\* -recurse

此命令表现出预期的行为:C:\folderThatDoesNotExist被正确解释为不存在的目录*路径(使用通配符请求其子元素),并且错误消息正确反映了这一点。


推荐阅读