Windows, PowerShell i camins llargs

Windows, PowerShell i camins llargs

Crec que tu, com jo, has vist camins com aquest més d'una vegada !!! Important____Nou____!!! No esborreu!!! Ordre núm. 98819-649-B de 30 de febrer de 1985 sobre el nomenament d'Ivan Aleksandrovich Kozlov com a cap interí temporal del departament per donar suport als clients VIP corporatius i organitzar reunions de negocis al marge.doc.

I sovint no podreu obrir aquest document a Windows immediatament. Algunes persones practiquen una solució alternativa en forma de mapeig de disc, altres utilitzen gestors de fitxers que poden treballar amb camins llargs: Far Manager, Total Commander i similars. I molts més van veure amb tristesa com el guió de PS que van crear, en el qual es va invertir molta feina i que va funcionar amb un esclat en l'entorn de prova, en un entorn de producció es queixava impotent d'una tasca impossible: El camí, el nom del fitxer o tots dos especificats són massa llargs. El nom del fitxer totalment qualificat ha de tenir menys de 260 caràcters i el nom del directori ha de tenir menys de 248 caràcters.
Com a resultat, 260 caràcters són suficients "no només per a tothom". Si us interessa anar més enllà dels límits del que està permès, consulteu el gat.

Aquestes són només algunes de les desafortunades conseqüències de limitar la longitud del camí del fitxer:

Divergent lleugerament del tema, noto que per a la replicació DFS, el problema tractat a l'article no és terrible i els fitxers amb noms llargs viatgen amb èxit de servidor en servidor (si, per descomptat, tota la resta és fet bé).

També m'agradaria cridar la vostra atenció sobre una utilitat molt útil que m'ha ajudat més d'una vegada Robocopy. Tampoc té por dels llargs camins, i pot fer moltes coses. Per tant, si la tasca es redueix a copiar/transferir dades de fitxers, podeu aturar-vos aquí. Si necessiteu fer trucs amb les llistes de control d'accés al sistema de fitxers (DACL), mireu cap a un altre costat subinacl. Malgrat la seva avançada edat, va funcionar excel·lentment a Windows 2012 R2. Aquí es consideren els mètodes d'aplicació.

M'interessava ensenyar a treballar amb camins llargs de PowerShell. Amb ell és gairebé com en una broma amb barba sobre Ivan Tsarevitx i Vasilisa la Bella.

De manera ràpida

Canvieu a Linux i no us preocupeu per Windows 10/2016/2019 i activeu la configuració adequada de la política de grup/ajusteu el registre. No m'atendré en aquest mètode en detall, perquè... Ja hi ha molts articles sobre aquest tema a Internet, per exemple, això.

Tenint en compte que la majoria d'empreses en tenen moltes, per dir-ho suaument, no les últimes versions de sistemes operatius, aquest mètode és ràpid només per escriure en paper, tret que, per descomptat, siguis d'aquells afortunats que tenen pocs sistemes heretats i Windows 10. /2016/2019 regna suprem .

El llarg camí

Anem a fer una reserva immediatament aquí perquè els canvis no afectaran el comportament de l'Explorador de Windows, però permetran utilitzar camins llargs als cmdlets de PowerShell, com ara Get-Item, Get-ChildItem, Remove-Item, etc.

Primer, actualitzem PowerShell. Es fa una, dues, tres vegades.

  1. Actualitzem .NET Framework a una versió no inferior a 4.5. El sistema operatiu ha de ser com a mínim Windows 7 SP1/2008 R2. Podeu descarregar la versió actual aquí, llegiu més informació aquí.
  2. Descarrega i instal·leu Windows Management Framework 5.1
  3. Reiniciem la màquina.

Les persones treballadores poden fer els passos descrits anteriorment manualment, les persones gandules poden fer-ho amb l'ajuda de SCCM, polítiques, scripts i altres eines d'automatització.

La versió actual de PowerShell es pot trobar des de la variable $PSVersionTable. Després de l'actualització, hauria de semblar a això:

Windows, PowerShell i camins llargs

Ara quan utilitzeu cmdlets Get-ChildItem i similars en lloc de l'habitual Camí utilitzarem LiteralPath.

El format del camí serà lleugerament diferent:

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

Per a la comoditat de convertir camins del format habitual al format LiteralPath podeu utilitzar aquesta funció:

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

Tingueu en compte que quan configureu el paràmetre LiteralPath No podeu utilitzar comodins (*, ? i així successivament).

A més del paràmetre LiteralPath, a la versió actualitzada del cmdlet de PowerShell Get-ChildItem obtingut el paràmetre Profunditat, amb el qual podeu establir la profunditat de nidificació per a la cerca recursiva, el vaig fer servir un parell de vegades i vaig quedar satisfet.

Ara no us haureu de preocupar perquè el vostre script de PS s'ani desviant pel llarg camí espinós i no podreu veure fitxers llunyans. Per exemple, aquest enfocament em va ajudar molt a l'hora d'escriure un script per restablir l'atribut "temporal" dels fitxers de les carpetes DFSR. Però aquesta és una altra història, que intentaré explicar en un altre article. Espero els vostres comentaris interessants i us proposo fer l'enquesta.

Enllaços útils:
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

Només els usuaris registrats poden participar en l'enquesta. Inicia sessiósi us plau.

El problema dels camins llargs és rellevant per a vostè?

  • Era rellevant, però ja estava decidit

  • Interfereix, però no gaire

  • No hi vaig pensar, sembla que tot funciona

  • No

  • Altres (especifiqueu als comentaris)

Han votat 155 usuaris. 25 usuaris es van abstenir.

Font: www.habr.com

Afegeix comentari