Windows, PowerShell en Long Paths

Windows, PowerShell en Long Paths

Ik tink dat jo, lykas ik, sa'n paden mear as ien kear sjoen hawwe !!! Wichtich____Nij____!!! Net wiskje!!! Bestelnr oer de beneaming fan Ivan Aleksandrovich Kozlov as tydlik waarnimmend haad fan 'e ôfdieling foar it stypjen fan corporate VIP-kliïnten en it organisearjen fan saaklike gearkomsten oan' e kant.doc.

En faaks kinne jo sa'n dokumint net direkt yn Windows iepenje. Guon minsken oefenje workaround yn 'e foarm fan skiifmapping, oaren brûke triembehearders dy't kinne wurkje mei lange paden: Far Manager, Total Commander en sa. En noch folle mear seagen mei fertriet nei it PS-skript dat se makken, dêr't in protte wurk yn waard ynvestearre en dat mei in knal yn 'e testomjouwing wurke, yn in produksjeomjouwing helpleas klagen oer in ûnmooglike taak: It oantsjutte paad, de triemnamme of beide binne te lang. De folslein kwalifisearre triemnamme moat minder dan 260 karakters wêze, en de mapnamme moat minder dan 248 karakters wêze.
Sa't bliken docht, is 260 tekens genôch "net allinich foar elkenien." As jo ​​​​ynteressearre binne om bûten de grinzen te gean fan wat tastien is, ferwize dan nei de kat.

Hjir binne gewoan wat fan 'e ûngelokkige gefolgen fan it beheinen fan triempaadlange:

In bytsje ôfwikend fan it ûnderwerp, merk ik op dat foar DFS-replikaasje it probleem besprutsen yn it artikel net ferskriklik is en bestannen mei lange nammen mei súkses reizgje fan tsjinner nei tsjinner (as, fansels, al it oare is rjocht dien).

Ik wol ek jo oandacht freegje op in heul nuttich nut dat my mear as ien kear holpen hat robocopy. Se is ek net bang foar lange paden, en se kin in protte. Dêrom, as de taak delkomt op it kopiearjen / oerdragen fan triemgegevens, kinne jo dêr stopje. As jo ​​trúkjes moatte spylje mei triemsysteem tagongskontrôlelisten (DACL's), sjoch fuort subinacl. Nettsjinsteande syn avansearre leeftyd prestearre it poerbêst op Windows 2012 R2. hjir metoaden fan tapassing wurde beskôge.

Ik wie ynteressearre yn learen hoe't ik wurkje mei lange PowerShell-paden. By him is it hast as yn in burdgrap oer Ivan Tsarevich en Vasilisa de Mooie.

Hurde manier

Skeakelje nei Linux en meitsje jo gjin soargen oer Windows 10/2016/2019 en skeakelje de passende ynstellings foar groepbelied / tweak it register yn. Ik sil net yn detail oer dizze metoade stean, om't ... Der binne al in soad artikels oer dit ûnderwerp op it ynternet, bygelyks, dit.

Yn betinken nommen dat de measte bedriuwen in protte hawwe, om it mild te sizzen, net de lêste ferzjes fan bestjoeringssystemen, dizze metoade is rap allinich foar skriuwen op papier, útsein as jo fansels ien fan 'e gelokken binne dy't in pear legacy-systemen hawwe en Windows 10 /2016/2019 regearret.

De lange wei

Litte wy hjir fuortendaliks in reservearje meitsje dat de wizigingen gjin ynfloed hawwe op it gedrach fan Windows Explorer, mar meitsje it mooglik om lange paden te brûken yn PowerShell cmdlets, lykas Get-Item, Get-ChildItem, Remove-Item, ensfh.

Litte wy earst PowerShell bywurkje. It is ien-twa-trije kear dien.

  1. Wy fernije it .NET Framework nei ferzje net leger as 4.5. It bestjoeringssysteem moat op syn minst Windows 7 SP1/2008 R2 wêze. Jo kinne de aktuele ferzje downloade hjir, lês mear ynformaasje hjir.
  2. Download en ynstallearje Windows Management Framework 5.1
  3. Wy rebootje de masine.

Hardworking minsken kinne dwaan de stappen beskreaun hjirboppe mei de hân, luie minsken kinne dwaan mei help fan SCCM, belied, skripts en oare automatisearring ark.

De hjoeddeistige ferzje fan PowerShell kin fûn wurde fan 'e fariabele $PSVersionTabel. Nei de fernijing moat it der sa útsjen:

Windows, PowerShell en Long Paths

No by it brûken fan cmdlets Get-ChildItem en sa yn stee fan de gewoane Paad wy sille brûke LiteralPath.

It paadformaat sil wat oars wêze:

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

Foar it gemak fan it konvertearjen fan paden fan it gewoane formaat nei it formaat LiteralPath jo kinne dizze funksje brûke:

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

Tink derom dat by it ynstellen fan de parameter LiteralPath Jo kinne gjin jokertekens brûke (*, ? en sa fierder).

Neist de parameter LiteralPath, yn 'e bywurke ferzje fan PowerShell cmdlet Get-ChildItem krige de parameter Djipte, wêrmei jo de nêstdjipte kinne ynstelle foar rekursyf sykjen, haw ik it in pear kear brûkt en wie tefreden.

No hoege jo gjin soargen te meitsjen dat jo PS-skript oer it lange stikelpaad dwaalt en gjin bestannen op ôfstân kin sjen. Bygelyks, dizze oanpak holp my in protte by it skriuwen fan in skript om it "tydlike" attribút fan bestannen yn DFSR-mappen werom te setten. Mar dat is in oar ferhaal, dat ik sil besykje te fertellen yn in oar artikel. Ik sjoch út nei nijsgjirrige opmerkings fan jo en stel foar dat jo de enkête nimme.

Nuttige 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-exception-with-new-psdrive/46309524
luisabreu.wordpress.com/2013/02/15/theliteralpath-parameter

Allinnich registrearre brûkers kinne meidwaan oan 'e enkête. Ynlogge, asjebleaft.

Is it probleem fan lange paden relevant foar jo?

  • dat

  • Wie relevant, mar al besletten

  • It interferes, mar net folle

  • Ik tocht der net oan, alles liket te wurkjen

  • gjin

  • Oare (spesifisearje asjebleaft yn opmerkings)

155 brûkers stimden. 25 brûkers ûntholden har.

Boarne: www.habr.com

Add a comment