Windows, PowerShell і доўгія шляхі

Windows, PowerShell і доўгія шляхі

Думаю, вам, як і мне, не раз даводзілася бачыць шляхі выгляду !!! Важнае____Новае____!!! Не выдаляць!!! Загад №98819-649-Б ад 30 лютага 1985г. аб прызначэнні Казлова Івана Аляксандравіча часова выконваючым абавязкі кіраўніка накіравання па суправаджэнні карпаратыўных VIP-кліентаў і арганізацыі дзелавых сустрэч у кулуарах.doc.

І часцяком адкрыць такі дакумент у Windows адразу не атрымаецца. Хтосьці практыкуе workaround у выглядзе мапіравання дыскаў, хтосьці выкарыстоўвае файлавыя менеджэры, якія ўмеюць працаваць з доўгімі шляхамі: Far Manager, Total Commander і ім падобныя. А яшчэ шматлікія з сумам назіралі, як створаны імі PS-скрыпт, у які было ўкладзена нямала працы і які ў тэставым асяроддзі працаваў на ўра, у баявым асяроддзі бездапаможна жаліўся на непасільную задачу: Адмысловая cestа, імя файла, або манера ёсць доўгі. Досылага цэлебраванага файла імя павінна быць не менш за 260 characters, а directory name павінна быць не менш за 248 characters.
Як аказалася, 260 знакаў хопіць «не толькі ўсім». Калі вам цікава выйсці за межы дазволенага - прашу пад кат.

Вось толькі некаторыя з сумных наступстваў абмежавання даўжыні файлавага шляху:

Трохі адхіляючыся ад тэмы, заўважу, што для DFS Replication разгляданая ў артыкуле праблема не страшная і файлы з доўгімі імёнамі паспяхова вандруюць з сервера на сервер (калі, вядома, у астатнім вы ўсё зрабілі правільна).

Яшчэ жадалася бы звярнуць увагу на вельмі карысную і не раз мяне якая выратоўвала ўтыліту Robocopy. Ёй таксама не страшныя доўгія шляхі, ды і ўмее яна шматлікае. Таму калі задача зводзіцца да капіявання/пераносу файлавых дадзеных, можна спыніцца на ёй. Калі трэба пашаманіць са спісамі кантролю доступу ў файлавай сістэме (DACL), паглядзіце ў бок субінакл. Нягледзячы на ​​самавіты ўзрост, выдатна сябе паказала на Windows 2012 R2. Тут разгледжаны спосабы прымянення.

Мне ж было цікава навучыць працаваць з доўгімі шляхамі PowerShell. З ім амаль як у барадатым анекдоце пра Івана-Царэвіча і Васілісу Выдатную.

Хуткі спосаб

Перайсці на Linux і не парыцца Windows 10/2016/2019 і ўключыць адпаведны параметр групавой палітыкі/ткнуць рэестр. Падрабязна на гэтым спосабе спыняцца не буду, т.я. у сетцы ўжо шмат артыкулаў на гэтую тэму, напрыклад, гэтая.

Улічваючы, што ў большасці кампаній шмат свежых версій аперацыйных сістэм, спосаб гэты хуткі толькі для напісання на паперы, калі, вядома, вы не з тых шчасліўчыкаў, у якіх мала legacy-сістэм і пануюць Windows 10/2016/2019 .

Доўгі спосаб

Тут адразу абмовімся, што змены не закрануць паводзіны правадыра Windows, а дадуць магчымасць выкарыстоўваць доўгія шляхі ў камандлетах PowerShell, такіх як 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, палітык, скрыптоў і энікіяў іншых сродкаў аўтаматызацыі.

Бягучую версію PowerShell можна пазнаць з зменнай $PSVersionTable. Пасля абнаўлення павінна быць прыкладна так:

Windows, PowerShell і доўгія шляхі

Цяпер пры выкарыстанні камандлетаў Get-ChildItem і яму падобных замест звыклага Шлях будзем выкарыстоўваць Літаральны шлях.

Фармат шляхоў пры гэтым будзе крыху іншым:

Get-ChildItem -LiteralPath "?C:Folder"
Get-ChildItem -LiteralPath "?UNCServerNameShare"
Get-ChildItem -LiteralPath "?UNC192.168.0.10Share"

Для зручнасці пераўтварэнні шляхоў са звыклага фармату ў фармат Літаральны шлях можна выкарыстоўваць вось такую ​​функцыю:

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"}
}

Звярніце ўвагу, што пры заданні параметра Літаральны шлях нельга выкарыстоўваць падстановачныя знакі (*, ? і г.д.).

Апроч параметру Літаральны шлях, у абноўленай версіі PowerShell камандлет Get-ChildItem атрымаў параметр Глыбіня, з дапамогай якога можна задаваць глыбіню ўкладзенасці для рэкурсіўнага пошуку, я пару разоў яго выкарыстоўваў і застаўся задаволены.

Зараз можна не баяцца, што ваш PS-скрыпт саб'ецца з доўгага цярністага шляху і не разгледзіць далёкія файлы. Мяне, напрыклад, вельмі выбавіў гэты падыход пры напісанні скрыпту для скідання атрыбуту "часовы" у файлаў у DFSR-тэчках. Але гэта ўжо іншая гісторыя, пра якую я пастараюся расказаць у іншым артыкуле. Ад вас жа чакаю цікавых каментароў і прапаную прайсці апытанне.

Карысныя спасылкі:
docs.microsoft.com/ru-ru/dotnet/api/microsoft.powershell.commands.contentcommandbase.literalpath?view=powershellsdk-1.1.0
docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-childitem?view=powershell-5.1
stackoverflow.com/questions/46308030/handling-path-too-long-exception-with-new-psdrive/46309524
luisabreu.wordpress.com/2013/02/15/theliteralpath-parameter

Толькі зарэгістраваныя карыстачы могуць удзельнічаць у апытанні. Увайдзіце, Калі ласка.

Ці актуальная для вас праблема доўгіх шляхоў?

  • Так

  • Была актуальная, але ўжо вырашыў

  • Перашкаджае, але не моцна

  • Не думаў пра гэта, быццам усё працуе

  • Няма

  • Іншае (пазначце ў каментарах)

Прагаласавалі 155 карыстальнікаў. Устрымаліся 25 карыстальнікаў.

Крыніца: habr.com

Дадаць каментар