Windows, PowerShell și căi lungi

Windows, PowerShell și căi lungi

Cred că, la fel ca și mine, ai văzut de nenumărate ori căi de tipul !!! Important____Nou____!!! Nu ștergeți!!! Ordin nr. 98819-649-B din 30 februarie 1985 privind numirea lui Kozlov Ivan Alexandrovich ca împuternicit temporar pentru conducerea direcției de suport pentru clienții VIP corporativi și organizarea întâlnirilor de afaceri în culise.doc.

Și adesea nu poți deschide un astfel de document în Windows din prima. Unii practică workaround-uri precum mappingul discurilor, alții folosesc manageri de fișiere care știu să lucreze cu căi lungi: Far Manager, Total Commander și altele similare. Iar mulți au observat cu tristețe cum scriptul PS pe care l-au creat, în care au investit mult efort și care a funcționat perfect în medii de testare, în mediu de producție se plângea ineficient de o sarcină prea grea: Calea specificată, numele fișierului sau ambele sunt prea lungi. Numele fișierului complet calificat trebuie să fie mai mic de 260 de caractere, iar numele directorului trebuie să fie mai mic de 248 de caractere.
Se pare că 260 de caractere nu sunt suficiente pentru „toată lumea”. Dacă ești interesat să depășești limitările impuse, te invit să continui.

Iată doar câteva dintre consecințele triste ale limitării lungimii căii fișierului:

Puțin deviind de la subiect, aș dori să menționez o utilitate foarte utilă care m-a ajutat de multe ori . Aceasta nu se teme de căile lungi și poate face multe. Prin urmare, dacă sarcina constă în copierea/mutarea datelor de fișiere, te poți opri la aceasta. Dacă trebuie să te ocupi cu listele de control al accesului în sistemul de fișiere (DACL), aruncă o privire spre).

subinacl robocopy. Ей тоже не страшны длинные пути, да и умеет она многое. Поэтому если задача сводится к копированию/переносу файловых данных, можно остановиться на ней. Если нужно пошаманить со списками контроля доступа в файловой системе (DACL), посмотрите в сторону subinacl. Cu toate că are o vârstă considerabilă, s-a comportat excelent pe Windows 2012 R2. Aici au fost analizate modurile de aplicare.

M-a interesat să învăț cum să lucrez cu căile lungi în PowerShell. E ca în gluma veche despre Ivan Țarevici și Vasilisa cea Frumoasă.

O metodă rapidă

Treceți pe Linux și nu vă mai faceți griji pentru Windows 10/2016/2019 și activați parametrul corespunzător al politicii de grup/schimbați registrul. Nu voi insista asupra acestei metode, deoarece pe internet există deja multe articole pe această temă, de exemplu, aceasta.

Luând în considerare că în majoritatea companiilor există multe versiuni de sisteme de operare care, apropo, nu sunt tocmai recente, această metodă este rapidă doar pe hârtie, cu excepția cazului în care sunteți printre norocoșii care au puține sisteme legate de vechi și domnesc Windows 10/2016/2019.

O metodă lungă

Aici trebuie spus din start că modificările nu vor afecta comportamentul Explorer-ului Windows, ci vor permite utilizarea căilor lungi în cmdlet-urile PowerShell, cum ar fi Get-Item, Get-ChildItem, Remove-Item etc.

Pentru început, să actualizăm PowerShell. Se face rapid și ușor.

  1. Actualizăm .NET Framework la o versiune de cel puțin 4.5. Sistemul de operare trebuie să fie de cel puțin Windows 7 SP1/2008 R2. Versiunea actuală poate fi descărcată aici, citiți informațiile suplimentare aici.
  2. Descărcăm și instalăm Windows Management Framework 5.1.
  3. Reporniți mașina.

Cei harnici pot efectua pașii descriși mai sus manual, cei leneși - cu ajutorul SCCM, politicilor, scripturilor și altor instrumente de automatizare.

Versiunea curentă de PowerShell poate fi aflată din variabila $PSVersionTable. După actualizare ar trebui să arate cam așa:

Windows, PowerShell și căi lungi

Acum, când utilizați cmdlet-urile Get-ChildItem și similare, în loc de familiarul Path vom folosi LiteralPath.

Formatul căilor va fi puțin diferit:

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

Pentru a facilita conversia căilor din formatul obișnuit în formatul LiteralPath puteți folosi următoarea funcție:

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

Rețineți că, atunci când setați parametrul LiteralPath nu se pot folosi caractere wildcard (*, ? etc.)

. Pe lângă parametrul LiteralPath, în versiunea actualizată a PowerShell, cmdlet-ul Get-ChildItem a primit parametrul Depth, cu ajutorul căruia se poate specifica adâncimea de căutare pentru căutarea recursivă, l-am folosit de câteva ori și am fost mulțumit.

Acum nu trebuie să-ți mai faci griji că scriptul tău PS va ieși de pe calea lungă și sinuoasă și nu va găsi fișierele îndepărtate. De exemplu, acestă abordare m-a ajutat foarte mult când am scris un script pentru a elimina atributul „temporar” de la fișiere în folderele DFSR. Dar este o altă poveste, despre care voi încerca să povestesc într-un alt articol. Aștept comentariile voastre interesante și vă propun să participați la sondaj.

Linkuri utile:
docs.microsoft.com/ro-ro/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

Numai utilizatorii înregistrați pot participa la sondaj. Conectați-vă, vă rugăm.

Este o problemă actuală pentru tine problema căilor lungi?

  • Da

  • A fost actuală, dar am rezolvat-o deja

  • Mă deranjează, dar nu foarte mult

  • Nu m-am gândit la asta, pare că totul funcționează

  • Nu

  • Altceva (specificați în comentarii)

155 de utilizatori au votat. 25 de utilizatori s-au abținut.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster