c# - 通过 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# 中执行此操作,我很乐意使用该解决方案)
解决方案
注意事项:
以下解决方案仅适用于启用短 (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
推荐阅读
- node.js - 如何从 useEffect 传递参数
- laravel - 在 Laravel 8 中,如何在未成功验证数据的情况下创建具有“失败”值的状态字段?
- apache-spark - 为什么 spark.ml CrossValidator 使用大数据集提供“广播大小为 X 的大型任务二进制文件”?
- javascript - 我如何让它记录每次迭代?
- python-3.x - 如何使用 deltalake_rs python 库获取 parquet 文件的子集来创建 deltatable
- javascript - 如何在 Javascrip 中进行内联字符串替换?
- python - 从带有漂亮汤的单个列表中的下拉列表中查找值
- postgresql - 用于 rds postgres 高可用性的 pgpool
- java - canvas2Draw - 如何将视图类连接到 canvas2
- python - 获取 Pandas Dataframe 中每个用户代码的两个日期之间的总金额