Windows, PowerShell og Long Paths

Windows, PowerShell og Long Paths

Jeg tror du, som meg, ofte har sett formenes veier !!! Viktig____Ny____!!! Ikke slett!!! Ordrenummer 98819-649-B datert 30. februar 1985 om utnevnelsen av Ivan Aleksandrovich Kozlov som fungerende leder for avdelingen for å støtte bedriftens VIP-kunder og organisere forretningsmøter på sidelinjen.doc.

Og ofte vil du ikke kunne åpne et slikt dokument i Windows med en gang. Noen praktiserer en løsning i form av diskmapping, noen bruker filbehandlere som kan jobbe med lange baner: Far Manager, Total Commander og lignende. Og mange flere så trist på hvordan PS-manuset de laget, som det ble investert mye arbeid i og som fungerte med et smell i testmiljøet, i kampmiljøet hjelpeløst klaget over en umulig oppgave: Den angitte banen, filnavnet eller begge er for lange. Det fullstendige filnavnet må være mindre enn 260 tegn, og katalognavnet må være mindre enn 248 tegn.
Som det viste seg, er 260 tegn nok "ikke bare for alle." Hvis du er interessert i å gå utover grensene for hva som er tillatt spør jeg under kat.

Her er bare noen av de uheldige konsekvensene av å begrense filbanelengden:

Litt avvikende fra emnet, merker jeg at for DFS-replikering er problemet som vurderes i artikkelen ikke forferdelig, og filer med lange navn lykkes med å reise fra server til server (med mindre, selvfølgelig, ellers du gjort riktig).

Jeg vil også trekke oppmerksomhet til et veldig nyttig verktøy som har hjulpet meg mer enn en gang robocopy. Heller ikke hun er redd for lange veier, og hun kan mye. Derfor, hvis oppgaven handler om å kopiere / overføre fildata, kan du stoppe ved det. Hvis du trenger å rote rundt med filsystemtilgangskontrolllister (DACL), se bort subinakl. Til tross for sin betydelige alder, viste den seg perfekt på Windows 2012 R2. Her påføringsmetoder vurderes.

Jeg var også interessert i å lære å jobbe med lange PowerShell-baner. Med ham, nesten som i en skjeggete vits om Ivan Tsarevich og Vasilisa den vakre.

Rask måte

Bytt til Linux og ikke bekymre deg for Windows 10/2016/2019 og aktiver riktig gruppepolicyinnstilling/registerjustering. Jeg vil ikke dvele ved denne metoden i detalj, fordi. det er allerede mange artikler på nettet om dette emnet, for eksempel, dette.

Med tanke på at det i de fleste selskaper er mange, mildt sagt, ikke ferske versjoner av operativsystemer, er denne metoden rask kun for å skrive på papir, med mindre du selvfølgelig er en av de heldige som har få eldre systemer og Windows 10/2016/2019 regjeringstid .

lang vei

Her tar vi umiddelbart forbehold om at endringene ikke vil påvirke oppførselen til Windows Utforsker, men vil gjøre det mulig å bruke lange baner i PowerShell cmdlets, som Get-Item, Get-ChildItem, Remove-Item, etc.

Først, la oss oppdatere PowerShell. Det er gjort en, to, tre.

  1. Vi oppdaterer .NET Framework til en versjon på minst 4.5. Operativsystemet må være minst Windows 7 SP1/2008 R2. Gjeldende versjon kan lastes ned herles mer informasjon her.
  2. nedlasting og installer Windows Management Framework 5.1
  3. Vi starter maskinen på nytt.

De hardtarbeidende kan gjøre trinnene ovenfor manuelt, de late kan gjøre det ved hjelp av SCCM, policyer, skript og andre automatiseringsverktøy.

Den gjeldende versjonen av PowerShell kan bli funnet fra variabelen $PSVersionTable. Etter oppdateringen skal det se slik ut:

Windows, PowerShell og Long Paths

Nå når du bruker cmdlets Get-ChildItem og andre liker ham i stedet for det vanlige Sti vi vil bruke bokstavelig bane.

Formatet på banene vil være litt annerledes:

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

For enkelhets skyld konvertere stier fra det vanlige formatet til formatet bokstavelig bane du kan bruke denne funksjonen:

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ær oppmerksom på at når du stiller inn parameteren bokstavelig bane jokertegn kan ikke brukes (*, ? og så videre).

I tillegg til parameteren bokstavelig bane, i den oppdaterte PowerShell-cmdleten Get-ChildItem mottatt parameter Dybde, som du kan stille inn hekkedybden for rekursivt søk med, jeg brukte den et par ganger og var fornøyd.

Nå kan du ikke være redd for at PS-skriptet ditt kommer på avveie fra en lang tornet vei og ikke vil se fjerne filer. For eksempel hjalp denne tilnærmingen meg mye når jeg skrev et skript for å tilbakestille det "midlertidige" attributtet for filer i DFSR-mapper. Men dette er en annen historie, som jeg skal prøve å fortelle i en annen artikkel. Jeg venter på interessante kommentarer fra deg, og jeg foreslår at du tar en undersøkelse.

Nyttige lenker:
docs.microsoft.com/en-us/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 registrerte brukere kan delta i undersøkelsen. Logg inn, vær så snill.

Er problemet med lange veier relevant for deg?

  • Ja

  • Var aktuelt, men allerede bestemt

  • Forstyrrer, men ikke mye

  • Tenkte ikke på det, alt ser ut til å fungere

  • Ikke

  • Annet (spesifiser i kommentarfeltet)

155 brukere stemte. 25 brukere avsto.

Kilde: www.habr.com

Legg til en kommentar