传递根驱动器路径时,为什么 PowerShell Test-Path 不能使用“\\?\”前缀?

传递根驱动器路径时,为什么 PowerShell Test-Path 不能使用“\\?\”前缀?

在 Windows 10 上,Test-Path 可与任何正常有效路径配合使用

PS C:\> Test-Path E:
True
PS C:\> Test-Path E:\
True
PS C:\> Test-Path E:\test
True

但如果我使用长路径前缀\\?\它仅当路径指向驱动器中的子文件夹时才有效

PS C:\> Test-Path \\?\E:\test
True
PS C:\> Test-Path \\?\E:\
Test-Path : Cannot retrieve the dynamic parameters for the cmdlet. Cannot process argument because the value of
argument "path" is not valid. Change the value of the "path" argument and run the operation again.
At line:1 char:1
+ Test-Path \\?\E:\
+ ~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Test-Path], ParameterBindingException
    + FullyQualifiedErrorId : GetDynamicParametersException,Microsoft.PowerShell.Commands.TestPathCommand

PS C:\> Test-Path \\?\E:
Test-Path : Cannot retrieve the dynamic parameters for the cmdlet. Cannot process argument because the value of
argument "path" is not valid. Change the value of the "path" argument and run the operation again.
At line:1 char:1
+ Test-Path \\?\E:
+ ~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Test-Path], ParameterBindingException
    + FullyQualifiedErrorId : GetDynamicParametersException,Microsoft.PowerShell.Commands.TestPathCommand

为什么会这样?有没有什么方法可以使它适用于任何\\?\路径?

答案1

我尝试了一些方法,true但仍然会产生错误。

Test-path -literalpath \\?\E:\
True

但是 powershell 发出了关于非法字符的警告,实际上输出如下所示:

PS C:\User\This-User> test-path -LiteralPath \\?\c:\
test-path : Caracteres no válidos en la ruta de acceso. #PC is in Spanish it means: Non valid characters in path
At line:1 char:1
+ test-path -LiteralPath \\?\c:\
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidArgument: (\\?\c:\:String) [Test-Path], ArgumentException
+ FullyQualifiedErrorId : ItemExistsArgumentError,Microsoft.PowerShell.Commands.TestPathCommand

True

但是它返回True。此外,如果你执行Resolve-path -literalpath \\?\c:它将返回如下内容:

Microsoft.PowerShell.Core\FileSystem::\\?\c:\

而如果驱动器不存在,它将不返回任何内容。

我不知道如何消除警告,但它会评估True它是否存在,False如果不存在

Resolve-path一个想法是在拆分字符串之后合并输出,Test-path但我认为您会以这种方式使用长路径名。

希望这有所帮助。

编辑:

此外,我认为在机器中使用物理驱动器时的正确语法是\\.\c:\这也将评估为True

答案2

我想我找到原因了。文档中有一条注释查找第一个文件API 说法

添加字符串\\?\不允许访问根目录。

因此很可能是Test-Path使用FindFirstFile

相关内容