Думаю, вам, як і мне, не раз даводзілася бачыць шляхі выгляду !!! Важнае____Новае____!!! Не выдаляць!!! Загад №98819-649-Б ад 30 лютага 1985г. аб прызначэнні Казлова Івана Аляксандравіча часова выконваючым абавязкі кіраўніка накіравання па суправаджэнні карпаратыўных VIP-кліентаў і арганізацыі дзелавых сустрэч у кулуарах.doc.
І часцяком адкрыць такі дакумент у Windows адразу не атрымаецца. Хтосьці практыкуе workaround у выглядзе мапіравання дыскаў, хтосьці выкарыстоўвае файлавыя менеджэры, якія ўмеюць працаваць з доўгімі шляхамі: Far Manager, Total Commander і ім падобныя. А яшчэ шматлікія з сумам назіралі, як створаны імі PS-скрыпт, у які было ўкладзена нямала працы і які ў тэставым асяроддзі працаваў на ўра, у баявым асяроддзі бездапаможна жаліўся на непасільную задачу: Адмысловая cestа, імя файла, або манера ёсць доўгі. Досылага цэлебраванага файла імя павінна быць не менш за 260 characters, а directory name павінна быць не менш за 248 characters.
Як аказалася, 260 знакаў хопіць «не толькі ўсім». Калі вам цікава выйсці за межы дазволенага - прашу пад кат.
Вось толькі некаторыя з сумных наступстваў абмежавання даўжыні файлавага шляху:
на серверы ёсць тэчка, напрыклад, D:DataSharedAccounting, якая расшарэна па SMB і мантуецца карыстачам як сеткавая кружэлка S; карыстачы ствараюць файлы, якія не змогуць прачытаць адміны/скрыпты пры лакальным доступе з сервера, т.я. абсалютны шлях атрымліваецца даўжэй сеткавага;
пры міграцыі дадзеных з іншых сістэм, у якіх менш жорсткія абмежаванні да даўжыні шляху, у новым асяроддзі частка з іх стане недаступнай без танцаў з бубнам;
Трохі адхіляючыся ад тэмы, заўважу, што для 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. Робіцца на раз-два-тры.
Абнаўляем .NET Framework да версіі не ніжэй за 4.5. Аперацыйная сістэма павінна быць не ніжэй Windows 7 SP1/2008 R2. Актуальную версію загрузіць можна тут, дадатковую інфармацыю пачытаць тут.
Спампоўваем і ўсталёўваны Windows Management Framework 5.1
Перазагружаем машыну.
Працавітыя могуць зрабіць апісаныя вышэй крокі ўручную, лянівыя - з дапамогай SCCM, палітык, скрыптоў і энікіяў іншых сродкаў аўтаматызацыі.
Бягучую версію PowerShell можна пазнаць з зменнай $PSVersionTable. Пасля абнаўлення павінна быць прыкладна так:
Цяпер пры выкарыстанні камандлетаў Get-ChildItem і яму падобных замест звыклага Шлях будзем выкарыстоўваць Літаральны шлях.
Для зручнасці пераўтварэнні шляхоў са звыклага фармату ў фармат Літаральны шлях можна выкарыстоўваць вось такую функцыю:
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-тэчках. Але гэта ўжо іншая гісторыя, пра якую я пастараюся расказаць у іншым артыкуле. Ад вас жа чакаю цікавых каментароў і прапаную прайсці апытанне.