不存在的文件夹上的 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.exe
的 dir
命令的不幸点头,其中 -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
被正确解释为不存在的 目录 路径(使用通配符请求其子元素 *
),错误消息正确反映了这一点。
我正在测试一个 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.exe
的 dir
命令的不幸点头,其中 -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
被正确解释为不存在的 目录 路径(使用通配符请求其子元素 *
),错误消息正确反映了这一点。