PowerShell и длинные имена файлов

При работе с файлами в powershell часто возникает примерно такая ошибка:

ls : The specified path, file name, or both are too long. The fully qualified file name must be less than 260
characters, and the directory name must be less than 248 characters.

    + CategoryInfo          : ReadError: (\\UKBTH05DFS03\...)\Post Exchange:String) [Get-ChildItem], PathTooLongException
    + FullyQualifiedErrorId : DirIOError,Microsoft.PowerShell.Commands.GetChildItemCommand

Или вот такая:

Get-Acl : Cannot find path '\\servername\d$\DFS\........................................................................
........................................................................................................................
...............................................' because it does not exist.
At C:\users\username\ScriptPath\Script.ps1:63 char:104
+ ... ory -Recurse | Get-Acl | Where {$_.AreAccessRulesProtected} | Select @{Name="Pat ...
+                    ~~~~~~~
    + CategoryInfo          : ObjectNotFound: (:) [Get-Acl], ItemNotFoundException
    + FullyQualifiedErrorId : GetAcl_PathNotFound_Exception,Microsoft.PowerShell.Commands.GetAclCommand

Эти ошибки являются суровым наследием и присутствует в Windows уже не один десяток лет. Надежных путей обхода этой ошибки существует несколько. Для доступа к файлам с длинными путями - robocopy и PSAlphaFS. Кроме того, есть хитрый трюк с монтированием сетевого диска.

PowerShell AlphaFS

Если с robocopy все понятно, то модуль AlphaFS появился относительно недавно.
Итак. Этот модуль есть в PSGallery. Чтобы установить AlphaFS выполняем:

Install-Module -Name PSAlphaFS

Это работает на Windows Server 2016. Если у вас более старая версия - нужно установить PackageManagement PowerShell Modules (как это сделать написано тут - https://docs.microsoft.com/en-us/powershell/gallery/readme) или тут инсталляторы x86 и x64 одним архивом: powershell_packagemanagement.rar.
В Windows 2008 R2 предварительно потребуется обновить и Powershell до версии 3.0,4.0 или 5.0. Как это сделать написано тут: https://social.technet.microsoft.com/wiki/contents/articles/20623.step-by-step-upgrading-the-powershell-version-4-on-2008-r2.aspx. Powershell 5.0 можно взять тут: https://www.microsoft.com/en-us/download/confirmation.aspx?id=54616

После установки модуля можно выполнять:

Get-LongChildItem ..... 

Теперь можно забыть про то, что “The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.”

Монтирование временного диска

Суть метода в том, что в системе монтируется временный диск с корнем в папке в которой лежат недоступные файлы. Таким образом, длина пути к файлам уменьшается на длину пути к корню временного диска.

Try{
    $ObjectACL = Get-ACL -Path $Folder
}
Catch{
    $SubPathLength = $Folder.FullName.substring(0,200).LastIndexOf('\')
    $NewTempPath = $Folder.FullName.SubString(0,$SubPathLength)
    New-PSDrive -Name "Temp4ACL" -PSProvider "FileSystem" -Root $NewTempPath
    $ObjectACL = Get-ACL "Temp4ACL:$($Folder.FullName.SubSTring($SubPathLength,$Folder.FullName.Length-$SubPathLength))"
    Remove-PSDrive -Name "Temp4ACL"
}
Enter your comment. Wiki syntax is allowed:
 
  • ms_windows_ms_sql/powershell_the_fully_qualified_file_name_must_be_less_than_260_workaround.txt
  • Last modified: 2019/02/11 09:13
  • by 127.0.0.1