Windows, PowerShell og lange stier

Windows, PowerShell og lange stier

Jeg tror, at du, ligesom jeg, har set stier som !!! Vigtigt____Nyt____!!! Må ikke slettes!!! Påbud nr. 98819-649-B fra 30. februar 1985 om udnævnelse af Ivan Alexandrovich Kozlov som midlertidig leder af afdelingen for støtte af virksomhedens VIP-kunder og organisering af forretningsmøder i kulisserne.doc.

Og ofte kan man ikke straks åbne sådan et dokument i Windows. Nogle bruger workaround ved at mappe drev, andre bruger filhåndterere, der kan arbejde med lange stier: Far Manager, Total Commander og lignende. Mange har også trist set, hvordan deres PS-script, som der var lagt meget arbejde i, og som fungerede perfekt i testmiljøet, i produktionsmiljøet hjælpeløst klagede over en uoverkommelig opgave: Den angivne sti, filnavn eller begge dele er for lange. Det fuldt kvalificerede filnavn skal være mindre end 260 tegn, og mappenavnet skal være mindre end 248 tegn.
Det viste sig, at 260 tegn ikke er nok for «alle». Hvis du er interesseret i at overskride grænserne - værsgo under cut.

Her er nogle af de triste konsekvenser af begrænsningen af filstien:

Lidt uden for emnet, vil jeg bemærke, at for DFS Replication er det problem, der omtales i artiklen, ikke så skræmmende, og filer med lange navne rejser sig succesfuldt fra server til server (hvis selvfølgelig, at du har gjort alt andet rigtigt).

Jeg vil også gerne fremhæve et meget nyttigt værktøj, som ofte har reddet mig. robocopy. Den er heller ikke bange for lange stier, og hun kan meget. Så hvis opgaven går ud på at kopiere/flytte fildata, kan man holde sig til hende. Hvis det handler om at eksperimentere med adgangskontrolister i filsystemet (DACL), skal man se mod subinacl. På trods af sin respektable alder har den klaret sig godt på Windows 2012 R2. Her er anvendelsesmetoder blevet overvejet.

Jeg var dog interesseret i at lære at arbejde med lange stier i PowerShell. Det er næsten som i den oldgamle vittighed om Ivan Tsarevich og Vasillisa den Skønne.

Hurtig metode

Skift til Linux og bekymr dig ikke om Windows 10/2016/2019, og aktivér den relevante gruppepolitikl eller tweak registreringsdatabasen. Jeg vil ikke gå i dybden med denne metode, da der allerede er mange artikler om emnet på nettet, for eksempel denne.

I betragtning af at mange virksomheder har, for at sige det mildt, mange ikke-nyere versioner af operativsystemer, er denne metode hurtig kun på papiret, medmindre du selvfølgelig er blandt de heldige, der har få legacy-systemer og kører Windows 10/2016/2019.

Langsom metode

Her skal vi straks gøre det klart, at ændringerne ikke vil påvirke Windows Stifinder, men give mulighed for at bruge lange stier i PowerShell-cmdlets som Get-Item, Get-ChildItem, Remove-Item osv.

Først opdaterer vi PowerShell. Det gøres på et-to-tre.

  1. Vi opdaterer .NET Framework til version 4.5 eller højere. Operativsystemet skal være mindst Windows 7 SP1/2008 R2. Den aktuelle version kan downloades her, læs yderligere information her.
  2. Download og installere Windows Management Framework 5.1
  3. Genstart maskinen.

Flittige personer kan udføre de ovenfor beskrevne trin manuelt, mens dovne får hjælp fra SCCM, politikker, scripts og andre automatiseringsværktøjer.

Den aktuelle version af PowerShell kan findes i variablen $PSVersionTable. Efter opdateringen skal det se nogenlunde sådan her ud:

Windows, PowerShell og lange stier

Nu, når du bruger cmdlets Get-ChildItem og lignende, i stedet for den sædvanlige Sti vil vi bruge LiteralPath.

Formatet af stierne vil være lidt anderledes:

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

For nem konvertering af stier fra det sædvanlige format til formatet LiteralPath kan du 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, at når du angiver parameteren LiteralPath man kan ikke bruge wildcard-tegn (*, ? etc.).

Udover parameteren LiteralPath, i den opdaterede version af PowerShell har cmdlet Get-ChildItem modtaget parameteren Depth, som gør det muligt at angive dybden af ​​neste niveau for rekursiv søgning. Jeg har brugt det et par gange og været tilfreds.

Nu behøver man ikke længere at frygte, at dit PS-script mister den lange og snoede vej og ikke kan finde fjerne filer. For eksempel har denne tilgang hjulpet mig meget, da jeg skrev et script til at nulstille attributten "temporær" 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 en afstemning.

Nyttige links:
docs.microsoft.com/da-dk/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, please.

Er problemet med lange stier relevant for dig?

  • Ja

  • Det var relevant, men jeg har allerede løst det

  • Generer, men ikke meget

  • Har ikke tænkt på det, ser ud til at alt fungerer

  • Nej

  • Andet (angiv i kommentarerne)

155 brugere har stemt. 25 brugere har undladt at stemme.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster