gpt4 book ai didi

Powershell、文件系统提供程序、Get-ChildItem 过滤……官方文档在哪里?

转载 作者:行者123 更新时间:2023-12-03 21:23:02 29 4
gpt4 key购买 nike

another question 中所述, 如果你尝试做一个 Get-ChildItem -filter ...与使用 -include 相比,您的命令受到更多限制而不是 -filter .我想阅读文件系统提供商过滤语法的官方文档,但经过半小时的搜索,我仍然没有找到它们。有谁知道在哪里看?

最佳答案

tl;dr -Filter 使用 .NET 的 FsRtllsNameInExpression 实现,即 documented on MSDN 以及基本的模式匹配信息。由于兼容性原因,该算法不直观,您可能应该避免使用此功能。此外,.NET 在其实现中有许多错误。
-Filter 不使用 PowerShell 提供的过滤系统——也就是说,它 而不是 使用 Get-Help about_Wildcard 描述的过滤系统。相反,它将过滤器传递给 Windows API。因此,过滤的工作方式与在使用 Windows API 的任何其他程序(例如 cmd.exe )中的工作方式相同。

相反,PowerShell 使用类似 FsRtlIsNameInExpression 的算法进行 -Filter 模式匹配。该算法基于旧的 MS-DOS 行为,因此充满了为遗留目的而保留的警告。通常说它具有三个常见的特殊字符。确切的行为很复杂,但或多或​​少如下:

  • * :匹配任意数量的字符(包括零)
  • ? :匹配一个字符,不包括名称中的最后一个句点
  • . :如果模式中的最后一个句点,则 anchor 定到文件名中的最后一个句点,如果没有句点,则 anchor 定到文件名的末尾;也可以匹配文字句点

  • 只是为了让事情变得更复杂,Windows 添加了三个额外的特殊字符,它们的行为与旧的 MS-DOS 特殊字符完全相同。原来的特殊字符现在的行为略有不同,以适应更灵活的文件系统。
  • " 等价于 MS-DOS .(ntifs.h 中的 DOS_DOTANSI_DOS_DOT)
  • < 等价于 MS-DOS ?(ntifs.h 中的 DOS_QMANSI_DOS_QM)
  • > 等价于 MS-DOS *(ntifs.h 中的 DOS_STARANSI_DOS_STAR)

  • 相当多的来源似乎颠倒了 <> 。可怕的是 Microsoft confuses them in their .NET implementation ,这意味着它们在 PowerShell 中也被颠倒了。此外,所有三个兼容性通配符都无法从 -Filter ,如 System.IO.Path mistakenly treats "<> as invalid, non-wildcard characters 。 (它允许 .*? 。)这导致了 -Filter 不完整、不稳定和有问题的观念。 您可以看到 .NET 算法 on GitHub 的(错误)实现。

    由于算法对 8.3 compatibility filenames 的支持,这也变得更加复杂,也称为“短”文件名。 (您可能以前见过它们;它们看起来像: SOMETH~1.TXT )如果文件的完整文件名 与短文件名匹配,则文件与模式匹配。 FrankFranchise has more information about this caveat in his answer.

    之前链接的关于 FsRtlIsNameInExpression 的 MSDN 文章有关于 Windows 文件名模式匹配的最新文档,但它并不是特别冗长。要更全面地解释匹配如何在 MS-DOS 上工作以及这如何影响现代匹配, this MSDN blog article 是我发现的最佳来源。这是基本思想:
  • 每个文件名正好是 11 个字节。
  • 前 8 个字节存储文件名的主体,右填充空格
  • 最后 3 个字节存储扩展名,右填充空格
  • 字母被转换为大写
  • 字母、数字、空格和一些仅匹配自身的符号
  • ? 匹配任何单个字符,但扩展名中的空格除外
  • . 将用空格填充前 8 个字节的剩余部分,然后前进到第 9 个字节(扩展的开始)
  • * 将用问号填充当前部分(正文或扩展名)的其余部分,然后前进到下一部分(或模式的末尾)

  • 转换如下所示:
                              11
    User 12345678901
    ------------ -----------
    ABC.TXT > ABC TXT
    WILDCARD.TXT > WILDCARDTXT
    ABC.??? > ABC ???
    *.* > ???????????
    *. > ????????
    ABC. > ABC

    将此推断为与现代文件系统一起使用充其量只是一个不直观的过程。例如,取如下目录:
    Name                 Compat Name
    -----------------------------------------------
    Apple1.txt APPLE1 .TXT
    Banana BANANA .
    Something.txt SOMETH~1.TXT
    SomethingElse.txt SOMETH~2.TXT
    TXT.exe TXT .EXE
    TXT.eexe TXT~1 .EEX
    Wildcard.txt WILDCARD.TXT

    我在 Windows 10 上对这些通配符进行了大量测试,结果非常不一致,尤其是 DOS_DOT ( " )。如果您在命令提示符下自行测试这些,您可能需要对它们进行转义(例如, cmd.exe 中的 dir ^>^"^> 以模拟 MS-DOS *.* )。
    *.*                 (everything)
    <"< (everything)
    * (everything)
    < Banana
    . (everything)
    " (everything)
    *. Banana
    <" Banana
    *g.txt Something.txt
    <g.txt Something.txt
    <g"txt (nothing)
    *1.txt Apple1.txt, Something.txt
    <1.txt Apple1.txt, Something.txt
    <1"txt (nothing)
    *xe TXT.eexe, TXT.exe
    <xe (nothing)
    *exe TXT.eexe, TXT.exe
    <exe TXT.exe
    ??????.??? Apple1.txt, Asdf.tx, Banana, TXT.eexe, TXT.exe
    >>>>>>.>>> Apple1.txt, Asdf.tx, TXT.eexe, TXT.exe
    >>>>>>">>> Banana
    ????????.??? (everything)
    >>>>>>>>.>>> (everything except Banana)
    >>>>>>>>">>> Banana
    ???????????.??? (everything)
    >>>>>>>>>>>.>>> (everything except Banana)
    >>>>>>>>>>>">>> Banana
    ?????? Banana
    >>>>>> Banana
    ??????????? Banana
    >>>>>>>>>>> Banana
    ???????????? Banana
    ???? (nothing)
    >>>> (nothing)
    Banana??. Banana
    Banana>>. Banana
    Banana>>" Banana
    Banana????. Banana
    Banana>>>>. Banana
    Banana>>>>" Banana
    Banana. Banana
    Banana" Banana
    *txt Apple1.txt, Something.txt, SomethingElse.txt, Wildcard.txt
    <txt Apple1.txt, Something.txt, SomethingElse.txt, Wildcard.txt
    *t Apple1.txt, Something.txt, SomethingElse.txt, Wildcard.txt
    <t (nothing)
    *txt* Apple1.txt, Something.txt, SomethingElse.txt, TXT.eexe, TXT.exe, Wildcard.txt
    <txt< Apple1.txt, Something.txt, SomethingElse.txt, Wildcard.txt
    *txt< Apple1.txt, Something.txt, SomethingElse.txt, Wildcard.txt
    <txt* Apple1.txt, Something.txt, SomethingElse.txt, TXT.eexe, TXT.exe, Wildcard.txt

    注意:在撰写本文时,WINE 的匹配算法在测试这些“陷阱”时会产生明显不同的结果。使用 WINE 1.9.6 测试。

    如您所见,向后兼容的 MS-DOS 通配符晦涩难懂且有缺陷。 Even Microsoft has implemented them incorrectly at least once ,目前还不清楚它们在 Windows 中的当前行为是否是故意的。 " 的行为似乎完全是随机的,我预计最后两个测试的结果会被交换。

    关于Powershell、文件系统提供程序、Get-ChildItem 过滤……官方文档在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6628875/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com