Windows, PowerShell a dlhé cesty

Windows, PowerShell a dlhé cesty

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:

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é urobili správne).

Ešte by som rád upozornil na veľmi užitočnú a nie raz ma zachránili pomocnú utilitu robocopy. 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 subinacl. Napriek svojmu pokročilému veku, ukázala sa skvele na Windows 2012 R2. Tu 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, toto.

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.

  1. 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ť tu, prečítať si doplňujúce informácie tu.
  2. Stiahneme a nainštalujeme Windows Management Framework 5.1
  3. 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:

Windows, PowerShell a dlhé cesty

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:
docs.microsoft.com/sk-sk/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

Len registrovaní používatelia sa môžu zúčastniť prieskumu. Prihláste sa, 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

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster