首页 > 解决方案 > 通过 cmd 或 powershell 打开资源管理器并选择文件(文件路径较长)

问题描述

我正在尝试使用 powershell(或 cmd)打开一个目录并选择一个文件(或一个目录)。

/select explorer 命令似乎不适用于长文件路径:

explorer.exe /select,\\?\filepath

我尝试了多种组合(引号中的整个文件路径,没有\\?\前缀等)。似乎没有任何效果。它只是打开默认的“这台电脑”位置。

我知道在powershell中我可以使用:

ii filepath

但这并不能解决问题,因为该ii命令会打开目标文件夹/文件,而不是打开父文件夹并选择所述文件夹/文件。

我非常感谢您的帮助。

(注意:我正在通过 C# 脚本 .NET Framework 4.7.2 启动 cmd/powershell。因此,如果可能有一种方法可以在没有 cmd/powershell 的 C# 中执行此操作,我很乐意使用该解决方案)

标签: c#powershellcmd

解决方案


注意事项

  • 以下解决方案仅适用于启用短 (8.3) 文件名的卷-默认情况下它们是启用的,但可以通过fsutil.exe实用程序的子命令关闭8dot3name该功能,无论是在系统范围内还是在每个卷的基础上。

    • 要查询给定卷的支持,请从提升的会话中运行以下命令,C:例如:
      • fsutil 8dot3name query C:
  • 我不清楚上述内容与UNC路径有何关系。另外,我认为,如果路径嵌套非常深,即使是路径的短版本也可能超过 259 个字符的总路径长度限制。

  • 在文件系统API级别,您可以将系统配置为默认支持超过 259 个字符的路径,而无需长路径选择加入前缀\\?\。这可以通过组策略或注册表来实现 - 有关更多信息,请参阅此答案

    • 不幸的是,即使启用了默认的长路径支持,explore.exe显然也不支持超过 259 个字符的路径。

我认为乔纳森给出了关键的指示:通过文件路径的(8.3)版本来解决explore.exe似乎不支持超过 259 个字符的路径的问题。

# Create a sample file with a long path (longer than 259 chars.)
$longFilePath = (New-Item -Force ("\\?\$HOME\_tmp" + 'x' * 250)).FullName

# Obtain the short (8.3) version of the long path.
# Note: Be sure to pass a FULL (absolute) path, which must be prefixed with '\\?\', 
#       unless default long-path support is enabled system-wide (see below).
$shortPathVersion =
  (New-Object -ComObject Scripting.FileSystemObject).GetFile($longFilePath).ShortPath

# Pass the short version of the path to explorer.exe
explorer.exe /select,$shortPathVersion

稍后运行Remove-Item -LiteralPath $longFilePath以清理示例文件。

笔记:

  • Windows PowerShell中 - 除非在系统范围内启用了默认的长路径支持 - 您需要\\?\为长路径(长度超过259字符的路径)使用前缀,如上面的New-Item调用所示。

    • PowerShell (Core) 7+中,不再需要此前缀 - 它内置了长路径支持;事实上,从 PowerShell 7.2 开始,有一些错误会在情况下阻止其使用(如果您的代码需要在两个PowerShell 版本中运行,这是有问题的) - 请参阅GitHub 问题 #10805
  • 除非启用默认的长路径支持,否则传递给的路径也(New-Object -ComObject Scripting.FileSystemObject).GetFile()需要\\?\前缀 - 甚至从 PowerShell (Core) 7+ 调用

    • 奇怪的是,返回的路径的简短版本保留了这个前缀,但explorer.exe似乎没有问题。
  • 尽管,通常是PowerShell中的元字符(数组构造函数),但在调用外部程序(例如explorer.exe"/select,$shortPathVersion"/select`,$shortPathVersion


推荐阅读