Windows PowerShell和长路径



我认为您像我一样,经常看到这种形式的路径 重要\ ____新____ \ !!! 1985年2月30日第98819-649-B号订单 任命Kozlov Ivan Aleksandrovich为该部门的临时负责人,负责护送公司VIP客户和在场外组织商务会议.doc

而且通常无法立即在Windows中打开这样的文档。 有人以磁盘映射的形式实践解决方法,有人使用可以使用长路径的文件管理器:Far Manager,Total Commander等。 当他们创建PS脚本时,更多可悲的是观看它们,这是一项艰巨的工作,并且在战斗环境中的测试环境中工作,在战斗环境中无助地抱怨一项不可能完成的任务: 指定的路径,文件名或两者都太长。 完全限定的文件名必须少于260个字符,目录名称必须少于248个字符。
事实证明,“不仅仅是每个人” 260个字符就足够了。 如果您有兴趣超越允许的范围-我要求猫。

这只是限制文件路径长度的一些可悲的后果:


与主题略有不同,我注意到,对于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。 完成一到二三。

  1. 我们将.NET Framework更新到不低于4.5的版本。 操作系统必须至少为Windows 7 SP1 / 2008 R2。 可以在此处下载当前版本,在此处阅读更多信息。
  2. 下载并安装Windows Management Framework 5.1
  3. 重新启动汽车。

努力工作的人员可以借助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.0
docs.microsoft.com/zh-CN/powershell/module/microsoft.powershell.management/get-childitem?view=powershell-5.1
stackoverflow.com/questions/46308030/handling-path-to-long-exception-with-new-psdrive/46309524
luisabreu.wordpress.com/2013/02/15/theliteralpath-parameter

Source: https://habr.com/ru/post/zh-CN457204/


All Articles