
我认为您像我一样,经常看到这种形式的路径
! 重要\ ____新____ \ !!! 1985年2月30日第98819-649-B号订单 任命Kozlov Ivan Aleksandrovich为该部门的临时负责人,负责护送公司VIP客户和在场外组织商务会议.doc 。
而且通常无法立即在Windows中打开这样的文档。 有人以磁盘映射的形式实践解决方法,有人使用可以使用长路径的文件管理器:Far Manager,Total Commander等。 当他们创建PS脚本时,更多可悲的是观看它们,这是一项艰巨的工作,并且在战斗环境中的测试环境中工作,在战斗环境中无助地抱怨一项不可能完成的任务:
指定的路径,文件名或两者都太长。 完全限定的文件名必须少于260个字符,目录名称必须少于248个字符。事实证明,“不仅仅是每个人” 260个字符就足够了。 如果您有兴趣超越允许的范围-我要求猫。
这只是限制文件路径长度的一些可悲的后果:
- 服务器上有一个文件夹,例如D:\ Data \ Shared \ Accounting,该文件夹通过SMB共享,并作为网络驱动器S挂载到用户; 用户创建的文件将无法通过服务器进行本地访问来读取管理员/脚本,因为 绝对路径比网络路径长;
- 漫游配置文件的同步错误 ;
- 从卷影复制中恢复的问题 ;
- 当从对路径长度没有严格限制的其他系统中迁移数据时,在新环境中,其中一些将变得不可访问,而无需铃鼓跳舞;
- 计算文件夹中文件的大小和数量时数据不正确 ;
- 等...
与主题略有不同,我注意到,对于DFS复制,本文中考虑的问题并不可怕,并且长名称的文件可以成功地在服务器之间传输(当然,除非其余所有操作都
正确完成 )。
我还想提请注意非常有用的
robocopy实用程序
,该实用程序对我有不止一次的帮助。 她也并不惧怕漫长的道路,她知道很多。 因此,如果任务归结为复制/传输文件数据,则可以在此停止。 如果您需要使用文件系统访问控制列表(DACL)进行萨满化,请查看
subinacl 。 尽管已使用了相当长的时间,但在Windows 2012 R2上却显示了出色的结果。 此处讨论应用方法。
教如何与PowerShell长期合作对我来说很有趣。 与他几乎像是关于伊凡·萨维奇和美丽的瓦西里莎的大胡子轶事。
快速方式
转到
Linux,不要启动Windows 10/2016/2019,并启用相应的组策略设置/单击注册表。 我不会详细介绍这种方法,因为 网络上已经有很多关于该主题的文章,例如,
这篇 。
鉴于在大多数公司中,有很多公司,而不是全新版本的操作系统,因此此方法仅适用于纸上书写,除非您是拥有很少的旧系统并且统治Windows 10/2016/2019的幸运者之一,否则该方法仅适用于纸上书写。
很长的路
在这里,我们立即保留更改不会影响Windows资源管理器行为的保留,但可以在PowerShell cmdlet中使用长路径,例如Get-Item,Get-ChildItem,Remove-Item等。
首先,升级PowerShell。 完成一到二三。
- 我们将.NET Framework更新到不低于4.5的版本。 操作系统必须至少为Windows 7 SP1 / 2008 R2。 可以在此处下载当前版本,在此处阅读更多信息。
- 下载并安装Windows Management Framework 5.1
- 重新启动汽车。
努力工作的人员可以借助SCCM,策略,脚本和其他自动化工具的
enikey手动完成懒惰的上述步骤。
当前版本的PowerShell可以在
$ PSVersionTable变量中找到。 更新后,应该是这样的:

现在,当使用
Get-ChildItem cmdlet等而不是通常的
Path时,我们将使用
LiteralPath 。
路径的格式将略有不同:
Get-ChildItem -LiteralPath "\\?\C:\Folder" Get-ChildItem -LiteralPath "\\?\UNC\ServerName\Share" Get-ChildItem -LiteralPath "\\?\UNC\192.168.0.10\Share"
为了方便将路径从熟悉的格式转换为
LiteralPath格式,可以使用以下功能:
Function ConvertTo-LiteralPath { Param([parameter(Mandatory=$true, Position=0)][String]$Path) If ($Path.Substring(0,2) -eq "\\") {Return ("\\?\UNC" + $Path.Remove(0,1))} Else {Return "\\?\$Path"} }
请注意,指定
LiteralPath参数时,不能使用通配符(
* ,?等)。
除了
LiteralPath参数之外,在PowerShell的更新版本中,
Get-ChildItem cmdlet还收到了
Depth参数,您可以使用该参数设置递归搜索的嵌套深度,我使用了几次,并感到满意。
现在,您不必担心您的PS脚本会误入歧途,并且无法辨认出远处的文件。 例如,这种方法在编写用于删除DFSR文件夹中文件的“临时”属性的脚本时对我有很大帮助。 但这是另一个故事,我将在另一篇文章中尝试讲述。
UPD 07/06/2019: 应许的文章我正在等待您的有趣评论,建议您进行调查。
有用的链接:docs.microsoft.com/zh-CN/dotnet/api/microsoft.powershell.commands.contentcommandbase.literalpath?view=powershellsdk-1.1.0docs.microsoft.com/zh-CN/powershell/module/microsoft.powershell.management/get-childitem?view=powershell-5.1stackoverflow.com/questions/46308030/handling-path-to-long-exception-with-new-psdrive/46309524luisabreu.wordpress.com/2013/02/15/theliteralpath-parameter