Windows, PowerShell ja pitkät polut

Windows, PowerShell ja pitkät polut

Luulen, että sinä, kuten minä, olet usein nähnyt muodon polkuja !!! Tärkeää____Uutta____!!! Älä poista Tilausnumero 98819-649-B, 30. helmikuuta 1985 Ivan Aleksandrovich Kozlovin nimittämisestä yritys-VIP-asiakkaiden tukemisen ja liiketapaamisten järjestämisen osaston vt. päälliköksi.doc.

Ja usein et voi avata tällaista asiakirjaa Windowsissa heti. Joku harjoittelee kiertotapaa levykartoituksen muodossa, joku käyttää tiedostonhallintaohjelmia, jotka voivat toimia pitkien polkujen kanssa: Far Manager, Total Commander ja vastaavat. Ja monet muutkin katsoivat surullisena, kuinka heidän luomansa PS-käsikirjoitus, johon panostettiin paljon työtä ja joka toimi räjähdysmäisesti testiympäristössä, taisteluympäristössä, valitti avuttomasti mahdottomasta tehtävästä: Määritetty polku, tiedostonimi tai molemmat ovat liian pitkiä. Täydellisen tiedostonimen on oltava alle 260 merkkiä pitkä ja hakemiston nimen on oltava alle 248 merkkiä pitkä.
Kuten kävi ilmi, 260 merkkiä riittää "ei vain kaikille". Jos olet kiinnostunut ylittämään sallitun rajat, kysyn alta cat.

Tässä on vain muutamia valitettavia seurauksia tiedostopolun pituuden rajoittamisesta:

Aiheesta hieman poiketen huomautan, että DFS-replikaatiossa artikkelissa käsitelty ongelma ei ole kauhea ja tiedostot, joilla on pitkät nimet kulkevat onnistuneesti palvelimelta palvelimelle (ellet tietysti muuten oikein tehty).

Haluaisin myös kiinnittää huomion erittäin hyödylliseen apuohjelmaan, joka on auttanut minua useammin kuin kerran robocopy. Hän ei myöskään pelkää pitkiä polkuja, ja hän tietää paljon. Siksi, jos tehtävä liittyy tiedostotietojen kopioimiseen / siirtämiseen, voit pysähtyä siihen. Jos joudut sekaisin tiedostojärjestelmän käyttöoikeusluetteloiden (DACL) kanssa, katso muualle subinacl. Huolimatta huomattavasta iästään, se näytti itsensä täydellisesti Windows 2012 R2:ssa. Täällä soveltamistapoja harkitaan.

Olin myös kiinnostunut oppimaan työskentelemään pitkien PowerShell-polkujen kanssa. Hänen kanssaan melkein kuin parrakasvitsissä Ivan Tsarevitšista ja Vasilisa Kauniista.

Nopea tapa

Vaihda Linuxiin äläkä ole huolissasi Windows 10/2016/2019:stä ja ota käyttöön sopiva ryhmäkäytäntöasetus/rekisterin säätö. En käsittele tätä menetelmää yksityiskohtaisesti, koska. verkossa on jo monia artikkeleita tästä aiheesta, esim. tämä.

Ottaen huomioon, että useimmissa yrityksissä on monia, lievästi sanoen, ei tuoreita käyttöjärjestelmien versioita, tämä menetelmä on nopea vain paperille kirjoittamiseen, ellet tietenkään ole yksi niistä onnekkaista, joilla on vähän vanhoja järjestelmiä ja Windows 10/2016/2019 hallituskausi.

pitkä matka

Täällä teemme heti varauksen, että muutokset eivät vaikuta Windowsin Resurssienhallinnan toimintaan, mutta mahdollistavat pitkien polkujen käytön PowerShell-cmdletissä, kuten Get-Item, Get-ChildItem, Remove-Item jne.

Ensin päivitetään PowerShell. Se on tehty yksi, kaksi, kolme.

  1. Päivitämme .NET Frameworkin vähintään versioon 4.5. Käyttöjärjestelmän on oltava vähintään Windows 7 SP1/2008 R2. Nykyinen versio on ladattavissa täällälue lisätietoja täällä.
  2. Lataa ja asenna Windows Management Framework 5.1
  3. Käynnistämme koneen uudelleen.

Ahkerat voivat tehdä yllä olevat vaiheet manuaalisesti, laiskot voivat tehdä sen SCCM:n, käytäntöjen, skriptien ja muiden automaatiotyökalujen avulla.

PowerShellin nykyinen versio löytyy muuttujasta $PSVersionTable. Päivityksen jälkeen sen pitäisi näyttää tältä:

Windows, PowerShell ja pitkät polut

Nyt kun käytät cmdlettejä Get-ChildItem ja muut pitävät hänestä tavallisen sijasta Polun, käytämme kirjaimellinenPath.

Polkujen muoto on hieman erilainen:

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

Polkujen muuntamisen helpottamiseksi tavallisesta formaatista muotoon kirjaimellinenPath voit käyttää tätä toimintoa:

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

Huomaa, että parametria asetettaessa kirjaimellinenPath jokerimerkkejä ei voi käyttää (*, ? ja niin edelleen).

Parametrin lisäksi kirjaimellinenPath, päivitetyssä PowerShell-cmdletissä Get-ChildItem vastaanotettu parametri Syvyys, jolla voi asettaa pesiytyssyvyyden rekursiiviseen hakuun, käytin pari kertaa ja olin tyytyväinen.

Nyt et voi pelätä, että PS-skriptisi menee harhaan pitkältä hankalalta tieltä eikä näe kaukaisia ​​tiedostoja. Tämä lähestymistapa auttoi minua esimerkiksi paljon, kun kirjoitin komentosarjan DFSR-kansioiden tiedostojen "väliaikainen"-attribuutin nollaamiseksi. Mutta tämä on toinen tarina, jonka yritän kertoa toisessa artikkelissa. Odotan teiltä mielenkiintoisia kommentteja ja ehdotan kyselyyn osallistumista.

Hyödyllisiä linkkejä:
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

Vain rekisteröityneet käyttäjät voivat osallistua kyselyyn. Kirjaudu sisään, ole kiltti.

Onko pitkien polkujen ongelma sinulle tärkeä?

  • Kyllä

  • Oli relevanttia, mutta jo päätetty

  • Häiritsee, mutta ei paljoa

  • En ajatellut sitä, kaikki näyttää toimivan

  • Ei

  • Muu (täsmennä kommenteissa)

155 käyttäjää äänesti. 25 käyttäjää pidättyi äänestämästä.

Lähde: will.com

Lisää kommentti