Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
ms_windows_ms_sql:powershell_the_fully_qualified_file_name_must_be_less_than_260_workaround [2019/01/09 12:30] – [PowerShell AlphaFS] adminms_windows_ms_sql:powershell_the_fully_qualified_file_name_must_be_less_than_260_workaround [2019/02/11 09:13] (current) – external edit 127.0.0.1
Line 1: Line 1:
 +====== PowerShell и длинные имена файлов ======
 +При работе с файлами в **powershell** часто возникает примерно такая ошибка:
 +<code>
 +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
 +</code>
 +Или вот такая:
 +<code>
 +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
 +</code>
 +
 +Эти ошибки являются суровым наследием и присутствует в **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 одним архивом: {{ :ms_windows_ms_sql:powershell_packagemanagement.rar | 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."**
 +
 +====== Монтирование временного диска ======
 +Суть метода в том, что в системе монтируется временный диск с корнем в папке в которой лежат недоступные файлы. Таким образом, длина пути к файлам уменьшается на длину пути к корню временного диска.
 +<code>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"
 +}
 +</code>
  • 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