当输入路径中有方括号时,Get-ChildItem -Recurse 是否会损坏?

2023-11-25

好吧,所以我感觉是这样的must是 PowerShell 中的一个错误,但我想看看你们是否认为这听起来很糟糕。这是一件很容易重现的事情,但我可以理解为什么它可能不是一个特别常见的用例。我在下面列出的步骤实际上并不是我的脚本正在执行的操作,我实际上是在计算子文件夹的大小 - 我只是将其压缩为显示我的问题的最简单的可能场景。

我只在 PowerShell 5.0.10240.16384 上尝试过此操作,但可能很快就有机会在早期版本上进行测试[Edit:我现在已经在 PowerShell 2.0 上对此进行了测试,并且该错误确实存在not出现在该版本中 - 它按预期工作]。只是一个简短的说明 - 我用过gci全文作为 Get-ChildItem 的缩写。如果您还不知道,这也适用于实际输入 PowerShell。但无论您使用什么别名,问题都存在。

首先,创建一个文件夹,名为Test [123]方便的地方。在该文件夹中,创建几个文件。我的叫做Test1.txt and Test2.txt。他们不需要有任何东西。

接下来,打开 PowerShell 会话并Set-Location to the 父文件夹你的新的Test [123] folder.

现在,运行gci -Filter Test*你应该看到类似的东西:

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       11/15/2015   3:22 PM                Test [123]

一切都很好,对吧?接下来,尝试一下gci -Filter Test* | gci。这使得第一个 gci 的输出成为下一个 gci 的输入,即向我们显示第一个 gci 返回的每个项目的子项。这给我们带来了以下结果:

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       11/14/2015  10:21 PM              0 Test1.txt
-a----       11/15/2015   3:55 PM              0 Test2.txt

再说一次,一切都很好——完全符合预期。这是我们的所有文件Test [123] folder.

现在试试这个:gci -Filter Test* | gci -Recurse。我们所改变的只是第二次调用gci现在是递归的,所以它应该向我们显示所有文件,包括子文件夹。我们没有任何子文件夹,所以我们期望相同的结果,对吧?

错误的。我们根本没有得到任何输出。看起来很奇怪,我们所做的一切都是添加的-Recurse现在我们得到不同的输出。我认为添加-Recurse永远不应该渲染less输出,只会更多。

这是下一个奇怪的事情。现在尝试gci -Filter Test* | gci -Recurse -Name。这与以前相同,除了-Name已添加参数。这只是说我们想要相同的输出,只是我们只想要文件名而不是每个项目的完整信息。所以我们可能不期待任何回报。但这不是我们得到的,我们得到的是:

Test1.txt
Test2.txt

这有got被打破,对吗?首先-Recurse永远不应该减少输出量,其次要求不同格式的输出不应该改变我们得到的输出量。

仅当文件夹名称中有方括号时才会发生这种情况。如果您创建另一个文件夹,只需调用Test,然后再次运行上面的所有命令,您将始终看到来自Test folder.

我的研究引导我-LiteralPath范围;但是,将上述命令改写为gci -Filter Test* | foreach { gci -Recurse -LiteralPath $_ },以便使用该参数,仍然不返回任何输出,并且再次添加-Name参数开始再次返回文件。

我已经设法解决这个问题,使用-Name参数,然后将其与我正在搜索的文件夹的路径组合,然后将其传递到Get-Item,但这使得代码比需要的更长、更丑。

所以我的问题是,我是否犯了错误或误解了什么?或者这是我应该报告的错误吗?


TL;DR:使用-LiteralPath当名称中可能存在不寻常的字符(包括方括号)时,该文件夹。


我无法按照 PowerShell v5.1.17134.590 中的 OP 重现此问题。

但是,我能够重现类似的内容,使用以下命令尝试列出我怀疑为空的文件夹中的文件,以便将其删除。事实上,这个文件夹有12个.mp3里面的文件:

[PS]> gci '.\Music\Artist - Name\Album Name [Disc 1]\'

[PS]>

添加-Recurseswitch 导致 cmdlet 返回错误,而不是上面显示的(误导性的)空响应。我用以下命令测试了相同的命令-Include *选项,仍然没有结果,但是这次与-Recurse switch.

-文字路径

对我来说最有效的方法是用-LiteralPath范围:

[PS]> gci -LiteralPath '.\Music\Artist - Name\Album Name [Disc 1]\'

Escaping

为了涵盖其他一些可能的情况,您可能需要尝试转义方括号。使用OP评论中@PetSerAl的建议,你可以尝试这样的事情:

[PS]> [System.Management.Automation.WildcardPattern]::Escape('.\Music\Artist - Name\Album Name [Disc 1]\')

.\Music\Artist - Name\Album Name `[Disc 1`]\

遗憾的是,这并没有立即奏效。我发现我需要逃离twice,然后以下命令给出了正确的目录列表:

[PS]> gci '.\Music\Artist - Name\Album Name ``[Disc 1``]\'

有关方括号和转义的更多信息,请参阅以下问答:

  • 如何在 PowerShell Get-ChildItem 中的通配符模式中使用方括号?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当输入路径中有方括号时,Get-ChildItem -Recurse 是否会损坏? 的相关文章

随机推荐

  • exc 错误访问代码 2

    过去三天我一直在与这个错误作斗争 但没有运气 我正在开发一个组合应用程序uiviewcontrollers and uitableviewcontrollers在表视图中 我单击 添加 按钮 它崩溃了 尚未添加核心数据编码 我什至已经启用N
  • 文件选择器在 Windows 上不接受 mimetype 'text/csv'

    我正在使用 filepicker 并设置 text csv 上传的 mimetype 它在 Mac chrome 上运行得很好 但在 Windows 上则不然 知道如何解决这个问题吗 谢谢 Ace 也尝试替代的模仿类型 text comma
  • 使用 BinData 进行 MongoDump 查询

    Mongodump 文档指定您可以使用特定查询进行转储 i e mongodump host localhost db mydb collection testCollection query SomeKey some value 我将 i
  • 将 UIImage 剪成圆形

    我想剪一个UIImage成一个圆圈 以便我可以将其用作注释 我在这个网站上找到的每个答案都描述了创建一个UIImageView 然后修改它并显示它 但你不能将注释的图像设置为UIImageView 只有一个UIImage 我该怎么办 Xco
  • Asp.Net MVC 生命周期[重复]

    这个问题在这里已经有答案了 可能的重复 与 ASP NET WebForms 相比 ASP NET MVC 页面的 页面生命周期 是怎样的 如果专家能够向我指出 ASP Net MVC 生命周期 我将不胜感激 我有兴趣知道一旦请求到来并发送
  • toSet 和类型推断

    有人可以解释为什么以下不起作用 当我这样做时 不知怎的会丢失编译类型推断的一些信息toSet 但我不明白为什么 scala gt case class Foo id Int name String defined class Foo sca
  • 如何在 Java 中填充数组?

    我知道如何正常执行此操作 但我可以发誓您可以填写如下 a 0 0 0 0 0 你是怎么做到的 我确实尝试过谷歌 但没有得到任何有用的信息 查看数组 fill方法 int array new int 4 Arrays fill array 1
  • 如何更改R中的矩阵列类型

    我有一个矩阵 我想将第五列类型从字符更改为数字 但我不能 我已经尝试过这个 test1 5 lt as numeric test1 5 但同样 列类是字符而不是数字 我应该怎么办 谢谢 就像 Marius所说 矩阵只能保存一种数据类型 您可
  • 在一个函数调用中向 R data.table 添加多列?

    我有一个返回列表中两个值的函数 这两个值都需要添加到 data table 的两个新列中 函数的评估成本很高 因此我想避免计算函数两次 这是例子 library data table example data table DT x y v
  • 如何使用 Xpath 1.0 比较字符串?

    我遇到了一个问题
  • 使用 SQL 查询进行 XML 解析

    我正在尝试解析 sql server 中的以下 xml 以获取所有 3 个 Id
  • 停止重复使用自定义单元 Swift

    我有一个uitableview使用从数组获取数据的自定义单元格 定制单元有一个uilabel and an uibutton 直到uilabel文本或为文本加载的数组对象 为零 启动时一切都很好 当我按下uibutton正在追加数组 新单元
  • DataAdapter:更新无法找到 TableMapping['Table'] 或 DataTable 'Table'

    此代码片段引发错误 更新无法在适配器上找到 TableMapping Table 或 DataTable Table Update ds 线 为什么它会抛出这种类型的错误 SqlConnection con new SqlConnectio
  • 无法从打印的 html 文件查看 gvisMotionChart

    当我将动态图表的代码保存到 html 文件并尝试打开它时 我看到页脚 并且 正在初始化 进度条闪烁了一瞬间 但没有显示任何其他内容 so M1 lt gvisMotionChart Fruits idvar Fruit timevar Ye
  • 如何从模板访问对象的属性?

    根据http handlebarsjs com expressions html 我应该能够做到这一点 h1 article title h1 但我似乎无法让它在流星中工作 这是我的模板
  • C# 中的数据透视表

    我需要在 net 中创建一个数据透视表 不能使用任何第三方控件 除非它是免费的 我试图找到解释如何创建数据透视表 算法或步骤 的文档 但几乎所有内容都与 Excel 相关 有谁知道如何在 C 中创建数据透视表 谢谢 在这里帮忙http ms
  • rabbitmq 队列上有多个消费者 - 只有一个消费者收到消息

    我实现了多个消费者 他们从单个队列中获取消息 我使用类似于这个例子 除了我正在无限循环中执行 basic get 进行轮询 知道如何防止所有消费者之间的竞争 因为只有一个消费者会收到消息 而另一个消费者将继续进行轮询 直到另一条消息到来为止
  • 在 R 中,如何用另一个字符串替换包含特定模式的字符串?

    我正在开展一个涉及清理大学专业数据列表的项目 我发现很多拼写错误 所以我想使用这个函数gsub 将拼写错误的拼写替换为正确的拼写 例如 假设 biolgy 在名为 Major 的专业列表中拼写错误 如何让 R 检测拼写错误并将其替换为正确的
  • 更新查询中具有多个匹配项的行

    给出如下更新语句 UPDATE UserAssesment SET AssessmentDate comp AssessmentDate FROM UserAssesment ua INNER JOIN vw CompletedAssess
  • 当输入路径中有方括号时,Get-ChildItem -Recurse 是否会损坏?

    好吧 所以我感觉是这样的must是 PowerShell 中的一个错误 但我想看看你们是否认为这听起来很糟糕 这是一件很容易重现的事情 但我可以理解为什么它可能不是一个特别常见的用例 我在下面列出的步骤实际上并不是我的脚本正在执行的操作 我