不存在的文件夹上的 PowerShell Get-ChildItem 的行为与 -recurse 标志不同

PowerShell Get-ChildItem on folder that does not exist behaves different with the -recurse flag

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

我已阅读帮助文件并进行了一些搜索,但找不到对此处发生的情况的解释。

考虑这 3 个强大的 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 does not exist

第三个错误是 c:\folderThatDoesNotExist\ not found

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

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

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

GitHub issue #5699 中讨论了这种问题严重的行为。

为了避免它,使用 -LiteralPath 而不是 -Path
警告user3608068 报告说这 在 PowerShell v4(可能还有所有较低版本)中没有帮助。


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

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

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


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

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