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

Bre*_*ers 6 powershell get-childitem

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

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

考虑以下 3 个 Power Shell 命令:

 Get-ChildItem -Path  C:\folderThatDoesNotExist -recurse

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

 Get-ChildItem -Path  C:\folderThatDoesNotExist\* -recurse
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

mkl*_*nt0 5

第一条命令: 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被正确解释为不存在的目录路径(正在使用通配符请求其子元素*),并且错误消息正确反映了这一点。