Myslím, že ste sa, rovnako ako ja, už viackrát stretli s cestami vo forme !!! Dôležité____Nové____!!! Neodstraňujte!!! Príkaz č. 98819-649-B zo 30. februára 1985 o menovaní Ivana Alexandroviča Kozlova dočasne vykonávajúcim funkciu vedúceho oddelenia na podporu podnikových VIP klientov a organizáciu obchodných stretnutí v kuloároch.doc.
A často sa taký dokument v systéme Windows hneď neotvorí. Niekto praktizuje workaround v podobe mapovania diskov, iní používajú správcu súborov, ktorý dokáže pracovať s dlhými cestami: Far Manager, Total Commander a podobne. Mnohí s ľútosťou sledovali, ako ich vytvorený PS skript, do ktorého vložili nesmierne úsilie a ktorý v testovacom prostredí fungoval skvele, v reálnom prostredí bezradne lamentoval nad neúnosnou úlohou: Zadaná cesta, názov súboru alebo oboje sú príliš dlhé. Úplný názov súboru musí mať menej ako 260 znakov a názov adresára musí mať menej ako 248 znakov.
Ako sa ukázalo, 260 znakov nebude stačiť "len tak všetkým". Ak vás zaujíma prekročiť povolené hranice — prosím pod kat.
Toto sú len niektoré z trpkých následkov obmedzenia dĺžky súborovej cesty:
- na serveri je napríklad zložka D:\Data\Shared\Accounting, ktorá je zdieľaná cez SMB a je pripojená používateľom ako sieťový disk S; používatelia vytvárajú súbory, ktoré administrátori/skripty nebudú môcť prečítať pri lokálnom prístupe zo servera, pretože absolútna cesta sa stáva dlhšou ako sieťová;
- ;
- ;
- pri migrácii dát z iných systémov, v ktorých sú obmedzenia na dĺžku cesty menej prísne, bude v novom prostredí časť z nich nedostupná bez tancovania s bubnom;
- ;
- atď...
Trochu sa od témy odkloním a poznamenám, že pre DFS replikáciu nie je problém v článku uvažovaný hrozbou a súbory s dlhými názvami úspešne putujú zo servera na server (ak ste samozrejme všetko iné ).
Ešte by som rád upozornil na veľmi užitočnú a nie raz ma zachránili pomocnú utilitu . Ani jej nie sú strašné dlhé cesty, a dokáže toho veľa. Takže ak je úloha spojená s kopírovaním/presúvaním súborových dát, môžete sa na ňu zamerať. Ak potrebujete manipulovať so zoznamami prístupových práv v súborovom systéme (DACL), pozrite sa smerom k . Napriek svojmu pokročilému veku, ukázala sa skvele na Windows 2012 R2. boli preskúmané spôsoby aplikácie.
Mňa však zaujímalo naučiť sa pracovať s dlhými cestami v PowerShell. Je to takmer ako v starom vtipe o Ivanovi Carovi a Vasilise Prekrasnej.
Rýchly spôsob
Prejsť na Linux a nemusieť sa trápiť s Windows 10/2016/2019 a zapnúť príslušný parameter skupinovej politiky/optimalizovať registrové kľúče. O tomto spôsobe sa podrobne rozpisovať nebudem, pretože na internete už existuje veľa článkov na túto tému, napríklad, .
Zohľadňujúc, že vo väčšine spoločností je veľa, mierne povedané, nezmodernizovaných verzií operačných systémov, je tento spôsob rýchly iba na papieri, ak samozrejme nie ste jedným z tých šťastlivcov, ktorí majú málo legacy systémov a prevládajú Windows 10/2016/2019.
Dlhý spôsob
Tu si hneď objasníme, že zmeny sa nedotknú správania Windows Prieskumníka, ale umožnia používať dlhé cesty v príkazoch PowerShell, ako napríklad Get-Item, Get-ChildItem, Remove-Item a ďalších.
Najprv aktualizujeme PowerShell. Robí sa to rýchlo a jednoducho.
- Aktualizujeme .NET Framework na verziu aspoň 4.5. Operačný systém by mal byť aspoň Windows 7 SP1/2008 R2. Aktuálnu verziu si môžete stiahnuť , prečítať si doplňujúce informácie .
- a nainštalujeme Windows Management Framework 5.1
- Reštartujeme stroj.
Pracovití môžu vykonať vyššie uvedené kroky manuálne, leniví — pomocou SCCM, politík, skriptov a iných automatizačných prostriedkov.
Aktuálnu verziu PowerShell môžete zistiť z premennej $PSVersionTable. Po aktualizácii by to malo vyzerať asi takto:

Teraz pri používaní príkazov Get-ChildItem a jemu podobných namiesto obvyklého Cesta budeme používať LiteralPath.
Formát ciest bude pritom trochu iný:
Get-ChildItem -LiteralPath "?C:Folder"
Get-ChildItem -LiteralPath "?UNCServerNameShare"
Get-ChildItem -LiteralPath "?UNC192.168.0.10Share"
Pre pohodlné prevádzanie ciest z obvyklého formátu na formát LiteralPath môžete použiť takúto funkciu:
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"}
}
Všimnite si, že pri zadávaní parametra LiteralPath nie je možné používať zástupné symboly (*, ? atď.).
Okrem parametra LiteralPath, v aktualizovanej verzii PowerShell príkaz Get-ChildItem získal parameter Depth, pomocou ktorého môžete určiť hĺbku vnorenia pre rekurzívne vyhľadávanie, ja som ho párkrát použil a zostal som spokojný.
Už sa nemusíte báť, že váš PS skript zablúdi z dlhej a ťažkej cesty a neuvidí vzdialené súbory. Mňa napríklad veľmi pomohol tento prístup pri písaní skriptu na odstránenie atribútu 'dočasný' zo súborov v DFSR priečinkoch. Ale to je už iný príbeh, o ktorom sa pokúsim rozprávať v inom článku. Očakávam od vás zaujímavé komentáre a navrhujem zúčastniť sa prieskumu.
Užitočné odkazy:
Len registrovaní používatelia sa môžu zúčastniť prieskumu. , prosím.
Je pre vás problém dlhých ciest aktuálny?
Áno
Bol aktuálny, ale už som to vyriešil
Prekáža, ale nie veľmi
Nad tým som neuvažoval, zdá sa, že všetko funguje
Nie
Iné (uvedte v komentároch)
Hlasovalo 155 používateľov. Zdržalo sa 25 používateľov.
Zdroj: habr.com
