打开资源管理器并通过 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
传递
我正在尝试使用 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's8dot3name
子命令的卷,无论是系统范围还是基于每个卷。- 要查询给定交易量的支持,运行 以下来自 提升的 会话,使用
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
传递