Windows, PowerShell og Long Paths

Windows, PowerShell og Long Paths

Jeg tror, ​​du, ligesom jeg, har set stier som denne mere end én gang !!! Vigtigt____Ny____!!! Slet ikke!!! Ordre nr. 98819-649-B dateret 30. februar 1985 om udnævnelsen af ​​Ivan Aleksandrovich Kozlov som midlertidigt fungerende leder af afdelingen for support af VIP-kunder til virksomheder og tilrettelæggelse af forretningsmøder på sidelinjen.doc.

Og ofte vil du ikke være i stand til at åbne et sådant dokument i Windows med det samme. Nogle mennesker praktiserer workaround i form af diskmapping, andre bruger filhåndtering, der kan arbejde med lange stier: Far Manager, Total Commander og lignende. Og mange flere så med vemod på det PS-manuskript, de lavede, som der blev investeret meget arbejde i, og som fungerede med et brag i testmiljøet, i et produktionsmiljø, der hjælpeløst klagede over en umulig opgave: Den angivne sti, filnavn eller begge er for lange. Det fuldt kvalificerede filnavn skal være mindre end 260 tegn, og mappenavnet skal være mindre end 248 tegn.
Som det viser sig, er 260 tegn nok "ikke kun for alle." Er du interesseret i at gå ud over grænserne for, hvad der er tilladt, så henvend dig til katten.

Her er blot nogle af de uheldige konsekvenser af at begrænse filstiens længde:

Afvigende lidt fra emnet bemærker jeg, at for DFS-replikering er problemet diskuteret i artiklen ikke forfærdeligt, og filer med lange navne rejser med succes fra server til server (hvis, selvfølgelig, alt andet er gjort rigtigt).

Jeg vil også gerne henlede din opmærksomhed på et meget nyttigt hjælpeprogram, der har hjulpet mig mere end én gang robocopy. Hun er heller ikke bange for lange veje, og hun kan meget. Derfor, hvis opgaven koger ned til kopiering/overførsel af fildata, kan du stoppe der. Hvis du har brug for at spille tricks med filsystemadgangskontrollister (DACL'er), så kig væk subinakl. På trods af sin høje alder klarede den sig fremragende på Windows 2012 R2. Her anvendelsesmetoder overvejes.

Jeg var interesseret i at lære at arbejde med lange PowerShell-stier. Hos ham er det næsten som i en skægget joke om Ivan Tsarevich og Vasilisa den Smukke.

Hurtig måde

Skift til Linux og bekymre dig ikke om Windows 10/2016/2019 og aktiver den relevante gruppepolitikindstilling/tweak registreringsdatabasen. Jeg vil ikke dvæle ved denne metode i detaljer, fordi... Der findes allerede mange artikler om dette emne på internettet, f.eks. dette.

I betragtning af at de fleste virksomheder har mange, mildt sagt, ikke de nyeste versioner af operativsystemer, er denne metode kun hurtig til at skrive på papir, medmindre du selvfølgelig er en af ​​de heldige, der har få ældre systemer og Windows 10 /2016/2019 regerer .

Den lange vej

Lad os her straks tage forbehold for, at ændringerne ikke vil påvirke adfærden af ​​Windows Stifinder, men vil gøre det muligt at bruge lange stier i PowerShell cmdlets, såsom Get-Item, Get-ChildItem, Remove-Item osv.

Lad os først opdatere PowerShell. Det er gjort en, to, tre gange.

  1. Vi opdaterer .NET Framework til version, der ikke er lavere end 4.5. Operativsystemet skal mindst være Windows 7 SP1/2008 R2. Du kan downloade den aktuelle version her, læs mere information her.
  2. Downloader og installer Windows Management Framework 5.1
  3. Vi genstarter maskinen.

Hårdtarbejdende mennesker kan udføre trinene beskrevet ovenfor manuelt, dovne mennesker kan gøre det ved hjælp af SCCM, politikker, scripts og andre automatiseringsværktøjer.

Den aktuelle version af PowerShell kan findes fra variablen $PSVersionTable. Efter opdateringen skulle det se sådan ud:

Windows, PowerShell og Long Paths

Nu når du bruger cmdlets Get-ChildItem og lignende i stedet for det sædvanlige Sti vi vil bruge bogstavelig sti.

Stiformatet vil være lidt anderledes:

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

For at gøre det nemmere at konvertere stier fra det sædvanlige format til formatet bogstavelig sti du kan bruge denne funktion:

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

Bemærk venligst, at når du indstiller parameteren bogstavelig sti Du kan ikke bruge jokertegn (*, ? og så videre).

Ud over parameteren bogstavelig sti, i den opdaterede version af PowerShell cmdlet Get-ChildItem fik parameteren Dybde, hvormed du kan indstille rededybden til rekursiv søgning, jeg brugte den et par gange og var tilfreds.

Nu behøver du ikke bekymre dig om, at dit PS-script kommer på afveje ad den lange tornede vej og ikke vil være i stand til at se fjerne filer. For eksempel hjalp denne tilgang mig meget, da jeg skrev et script for at nulstille den "midlertidige" attribut for filer i DFSR-mapper. Men det er en anden historie, som jeg vil forsøge at fortælle i en anden artikel. Jeg ser frem til interessante kommentarer fra dig og foreslår, at du deltager i undersøgelsen.

Nyttige links:
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

Kun registrerede brugere kan deltage i undersøgelsen. Log ind, Vær venlig.

Er problemet med lange veje relevant for dig?

  • Ja

  • Var relevant, men allerede besluttet

  • Det forstyrrer, men ikke meget

  • Jeg tænkte ikke over det, alt ser ud til at virke

  • Nej

  • Andet (angiv venligst i kommentarer)

155 brugere stemte. 25 brugere undlod at stemme.

Kilde: www.habr.com

Tilføj en kommentar