powershell - 不存在的文件夹上的 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 的错误。为什么前两个给出不同的错误?
解决方案
第一个命令: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
被正确解释为不存在的目录*
路径(使用通配符请求其子元素),并且错误消息正确反映了这一点。
推荐阅读
- javascript - 根据其他标签使用jquery选择输入
- javascript - 单个元素上的多个事件
- laravel - 在查询中计算带有 if 条件的列
- visual-studio - Visual Studio 中的 NuGet 包管理器:无法加载源 https://api.nuget.org/v3/index.json 的服务索引
- vba - 将单元格格式/样式存储为 VBA 中的变量
- jquery - 导航菜单从小屏切换到全屏后消失
- java - 迁移 AEM 用户生成的内容
- httpresponse - Oracle Service Bus:业务服务将传输编码提供为 'chunked' ,即使禁用了 'Use chunked streaming mode'
- node.js - fuse-box 导致 GET http://localhost:4444/ net::ERR_CONNECTION_REFUSED
- python - 如何使用 for 循环遍历一个数字?