【问题标题】:PowerShell Get-ChildItem on folder that does not exist behaves different with the -recurse flag不存在的文件夹上的 PowerShell Get-ChildItem 与 -recurse 标志的行为不同
【发布时间】:2019-08-14 03:16:28
【问题描述】:

我正在测试一个 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\ not found

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

【问题讨论】:

  • 使用-Include *

标签: powershell get-childitem


【解决方案1】:

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

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

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

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


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

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

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


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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 2017-02-21
    • 2019-08-26
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    相关资源
    最近更新 更多