Windows, PowerShell a dlhé cesty

Windows, PowerShell a dlhé cesty

Myslím, že ste, rovnako ako ja, videli takéto cesty viac ako raz !!! Dôležité____Novinka____!!! Nemazať!!!Objednávka č.98819-649-B zo dňa 30 o vymenovaní Ivana Aleksandroviča Kozlova za dočasného vedúceho oddelenia podpory firemných VIP klientov a organizovanie obchodných stretnutí na okraj.doc.

A často nebudete môcť takýto dokument v systéme Windows otvoriť hneď. Niektorí praktizujú workaround v podobe mapovania diskov, iní využívajú správcov súborov, ktorí dokážu pracovať s dlhými cestami: Far Manager, Total Commander a podobne. A mnohí ďalší so smútkom sledovali PS scenár, ktorý vytvorili, do ktorého sa investovalo veľa práce a ktorý zafungoval v testovacom prostredí, v produkčnom prostredí sa bezmocne sťažoval na nemožnú úlohu: Zadaná cesta, názov súboru alebo oboje sú príliš dlhé. Plne kvalifikovaný 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 je dosť „nielen pre každého“. Ak máte záujem ísť za hranice toho, čo je povolené, obráťte sa na mačku.

Tu sú len niektoré z nešťastných dôsledkov obmedzenia dĺžky cesty k súboru:

Trochu sa odchyľujem od témy a poznamenávam, že v prípade replikácie DFS nie je problém diskutovaný v článku hrozný a súbory s dlhými názvami úspešne putujú zo servera na server (ak je, samozrejme, všetko ostatné urobené správne).

Chcel by som tiež upozorniť na veľmi užitočnú pomôcku, ktorá mi pomohla viac ako raz roboskopia. Nebojí sa ani dlhých ciest a dokáže toho naozaj veľa. Preto, ak sa úloha zredukuje na kopírovanie/prenos údajov súboru, môžete sa tam zastaviť. Ak si potrebujete zahrať triky so zoznamami riadenia prístupu k súborovému systému (DACL), pozrite sa inam subinakl. Napriek svojmu pokročilému veku fungoval na Windows 2012 R2 vynikajúco. tu zvažujú sa spôsoby aplikácie.

Zaujímalo ma učiť, ako pracovať s dlhými cestami PowerShell. S ním je to skoro ako v bradatom vtipe o Ivanovi Tsarevičovi a Vasilise Krásnej.

Rýchla cesta

Prejdite na Linux a nestarajte sa o Windows 10/2016/2019 a povoľte príslušné nastavenie skupinovej politiky/vyladenie registra. Nebudem sa touto metódou podrobne zaoberať, pretože... Na internete je už veľa článkov na túto tému, napr. toto.

Vzhľadom na to, že väčšina spoločností má veľa, mierne povedané, nie najnovšie verzie operačných systémov, táto metóda je rýchla iba na písanie na papier, pokiaľ, samozrejme, nepatríte medzi tých šťastlivcov, ktorí majú málo starších systémov a Windows 10 /2016/2019 kraľuje .

Dlhá cesta

Okamžite si tu urobme rezerváciu, že zmeny neovplyvnia správanie Prieskumníka Windows, ale umožnia používať dlhé cesty v cmdletoch PowerShell, ako sú Get-Item, Get-ChildItem, Remove-Item atď.

Najprv aktualizujme PowerShell. Robí sa to raz, dva, tri krát.

  1. Aktualizujeme .NET Framework na verziu nie nižšiu ako 4.5. Operačný systém musí byť aspoň Windows 7 SP1/2008 R2. Môžete si stiahnuť aktuálnu verziu tu, prečítajte si viac informácií tu.
  2. stiahnite a nainštalujte si Windows Management Framework 5.1
  3. Reštartujeme stroj.

Pracovití ľudia zvládnu vyššie popísané kroky ručne, leniví s pomocou SCCM, politík, skriptov a iných automatizačných nástrojov.

Aktuálnu verziu prostredia PowerShell nájdete v premennej $PSVersionTable. Po aktualizácii by to malo vyzerať asi takto:

Windows, PowerShell a dlhé cesty

Teraz pri používaní cmdlet Get-ChildItem a podobne namiesto obvyklého Cesta budeme používať doslovná cesta.

Formát cesty sa bude mierne líšiť:

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

Pre pohodlie prevodu ciest z obvyklého formátu do formátu doslovná cesta môžete použiť tú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"}
}

Upozorňujeme, že pri nastavovaní parametra doslovná cesta Nemôžete použiť zástupné znaky (*, ? a tak ďalej).

Okrem parametra doslovná cesta, v aktualizovanej verzii cmdlet PowerShell Get-ChildItem dostal parameter Hĺbka, s ktorým sa dá nastaviť hĺbka vnorenia pre rekurzívne vyhľadávanie, som ho párkrát použil a bol som spokojný.

Teraz sa už nemusíte obávať, že váš skript PS zablúdi po dlhej tŕnistej ceste a nebude môcť vidieť vzdialené súbory. Tento prístup mi napríklad veľmi pomohol pri písaní skriptu na obnovenie atribútu „dočasný“ súborov v priečinkoch DFSR. Ale to je iný príbeh, ktorý sa pokúsim povedať v inom článku. Teším sa na vaše zaujímavé komentáre a navrhujem, aby ste sa zúčastnili prieskumu.

Užitočné odkazy:
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

Do prieskumu sa môžu zapojiť iba registrovaní užívatelia. Prihlásiť saProsím.

Je pre vás problém dlhých ciest aktuálny?

  • Да

  • Bolo to relevantné, ale už rozhodnuté

  • Prekáža, ale nie veľmi

  • Nemyslel som na to, zdá sa, že všetko funguje

  • Nie

  • Iné (uveďte v komentároch)

Hlasovalo 155 užívateľov. 25 užívateľov sa zdržalo hlasovania.

Zdroj: hab.com

Pridať komentár