为什么 PowerShell Core 7 无法识别 UNC 路径,而 Windows PowerShell 和 cmd 可以?

Why doesn't PowerShell Core 7 recognize UNC paths when Windows PowerShell and cmd do?

PowerShell 似乎无法识别 \?\ 表示法。为什么不呢?

=== cmd.exe

C:>ver
Microsoft Windows [Version 10.0.17763.1935]
C:>DIR "\?\C:\Users\*"
 Volume in drive \?\C: is Windows
 Volume Serial Number is 1C66-809A

 Directory of \?\C:\Users

2021-08-04  12:27    <DIR>          .
2021-08-04  12:27    <DIR>          ..
2019-11-25  16:22    <DIR>          Administrator
...               0 File(s)              0 bytes
              28 Dir(s)  81,919,647,744 bytes free

=== Windows powershell.exe

PS C:\Users> $PSVersionTable.PSVersion.ToString()
5.1.17763.1852
PS C:\Users> Get-ChildItem -Path "\?\C:\Users\*"

    Directory: \?\C:\Users

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2019-11-25     15:22                Administrator
...
PS C:\Users>

=== PowerShell 核心 pwsh.exe

PS C:\Users> $PSVersionTable.PSVersion.ToString()
7.1.4
PS C:\Users> Get-ChildItem -Path "\?\C:\Users\*"
PS C:\Users>

鉴于此约定特定于 Win32(并且 PowerShell 已被重新编写为跨平台),很可能不再支持它。

如果您的代码的其他部分需要这种格式,适当放置的内联 -replace 可以将其删除

$("\?\C:\Users\*" -replace '\\\?\', '')

您的路径语法 UNC 路径无关;它使用特殊前缀[1]\?\,其目的是选择支持文件-长度超过 259 个字符的系统路径.

Windows PowerShell(Windows 附带的遗留 PowerShell 版本,其最新和 final版本为v5.1):

  • \?\ 受支持,如您的问题所示。

PowerShell (Core) 6+(跨平台按需安装版)中:

  • \?\ 不再需要,因为默认支持长路径[=62] =].

  • 也就是说,它应该仍然 支持 - 尤其是为了支持在 both PowerShell 版本 - 事实上 它不是,从 PowerShell 7.2 开始 - 在某些情况下会导致 no 输出,使用 wildcard 路径,Get-ChildItem -Path \?\C:\Users\*,或使用 root 目录的内容(!),使用 literal 路径 Get-ChildItem -LiteralPath \?\C:\Users - 是 GitHub issue #10805 的主题。


[1] 这样的前缀标识 Win32 命名空间 \?\ 的细节解释 here.