打开资源管理器并通过 cmd 或 powershell 选择文件(具有长文件路径)

Opening explorer and selecting a file (with a long file path) through cmd or powershell

我正在尝试使用 powershell(或 cmd)打开目录和 select 文件(或目录)。

/select 资源管理器命令似乎不适用于长文件路径:

explorer.exe /select,\?\filepath

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

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

ii filepath

但这并不能解决问题,因为 ii 命令打开目标 folder/file 而不是打开父对象 selecting 表示 folder/file。

非常感谢您的帮助。

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

注意事项:

  • 以下解决方案 仅适用于 short (8.3) file names are enabled - they are by default, but the feature can be turned off , via the fsutil.exe utility's 8dot3name 子命令的卷,无论是系统范围还是基于每个卷。

    • 要查询给定交易量的支持,运行 以下来自 提升的 会话,使用 C: 作为示例:
      • fsutil 8dot3name query C:
  • 我不清楚以上与 UNC 路径的关系。另外,我认为,如果路径嵌套非常深,即使是短版本的路径也可以假设超过 259 个字符的总路径长度限制。

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

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

我认为Jonathan给出了关键的指针:通过short (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 开始,有 bug 在某些情况下会阻止它的使用(如果你的代码需要 运行 in both PowerShell 版本)- 请参阅 GitHub issue #10805
  • 除非启用默认的长路径支持,否则传递给 (New-Object -ComObject Scripting.FileSystemObject).GetFile() 的路径也需要 \?\ 前缀 - 即使从 PowerShell (Core) 7+[=33 调用也是如此=]

    • 奇怪的是,返回的路径的短版本 保留了 这个前缀,但是 explorer.exe 似乎没有问题。
  • 尽管 , 通常是 PowerShell(数组构造函数)中的 元字符 ,但在调用 外部程序时 ,例如 explorer.exe,它确实 而不是 ,因此没有严格的必要将参数作为 "/select,$shortPathVersion"/select`,$shortPathVersion 传递