为什么 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.
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.