Windows, PowerShell a dlouhé cesty

Windows, PowerShell a dlouhé cesty

Myslím, že jste, stejně jako já, viděli podobné cesty více než jednou !!! Důležité____Novinka____!!! Nemazat!!!Objednávka č. 98819-649-B ze dne 30 o jmenování Ivana Aleksandroviče Kozlova dočasným zastupujícím vedoucím oddělení pro podporu firemních VIP klientů a organizování obchodních jednání na okraj.doc.

A často nebudete moci takový dokument otevřít ve Windows hned. Někdo praktikuje workaround v podobě mapování disku, jiný používá souborové manažery, které umí pracovat s dlouhými cestami: Far Manager, Total Commander a podobně. A mnozí další se smutkem sledovali PS scénář, který vytvořili, do kterého bylo investováno hodně práce a který fungoval s třeskem v testovacím prostředí, v produkčním prostředí si bezmocně stěžoval na nesplnitelný úkol: Zadaná cesta, název souboru nebo obojí jsou příliš dlouhé. Plně kvalifikovaný název souboru musí mít méně než 260 znaků a název adresáře musí mít méně než 248 znaků.
Jak se ukazuje, 260 znaků je dost „nejen pro každého“. Pokud máte zájem jít za hranice povoleného, ​​obraťte se na kočku.

Zde jsou jen některé z nešťastných důsledků omezení délky cesty k souboru:

Mírně se odchyluji od tématu a podotýkám, že pro replikaci DFS není problém popsaný v článku nijak hrozný a soubory s dlouhými názvy úspěšně putují ze serveru na server (pokud je samozřejmě vše ostatní provedeno správně).

Rád bych také upozornil na velmi užitečný nástroj, který mi pomohl více než jednou robocopy. Nebojí se ani dlouhých cest a umí toho opravdu hodně. Pokud se tedy úkol scvrká na kopírování/přenos dat souboru, můžete se tam zastavit. Pokud si potřebujete zahrát triky se seznamy řízení přístupu k systému souborů (DACL), podívejte se jinam subinacl. I přes svůj pokročilý věk si ve Windows 2012 R2 vedl skvěle. Zde zvažují se způsoby aplikace.

Zajímalo mě učit, jak pracovat s dlouhými cestami PowerShellu. S ním je to skoro jako ve vousatém vtipu o Ivanu Careviči a Vasilise Krásné.

Rychlá cesta

Přejděte na Linux a nestarejte se o Windows 10/2016/2019 a povolte příslušné nastavení skupinových zásad/vyladění registru. Nebudu se touto metodou podrobně zabývat, protože... Na toto téma je na internetu již mnoho článků, např. tohle.

Vzhledem k tomu, že většina společností má mnoho, mírně řečeno, ne nejnovější verze operačních systémů, je tato metoda rychlá pouze pro psaní na papír, pokud ovšem nepatříte mezi ty šťastlivce, kteří mají málo starších systémů a Windows 10 /2016/2019 kraluje .

dlouhá cesta

Okamžitě si zde udělejme rezervaci, že změny neovlivní chování Průzkumníka Windows, ale umožní používat dlouhé cesty v rutinách PowerShellu, jako jsou Get-Item, Get-ChildItem, Remove-Item atd.

Nejprve aktualizujme PowerShell. Dělá se to jednou, dvakrát, třikrát.

  1. Aktualizujeme rozhraní .NET Framework na verzi ne nižší než 4.5. Operační systém musí být alespoň Windows 7 SP1/2008 R2. Aktuální verzi si můžete stáhnout zde, přečtěte si další informace zde.
  2. Stáhnout a nainstalujte Windows Management Framework 5.1
  3. Restartujeme stroj.

Pracovití lidé zvládnou výše popsané kroky ručně, líní lidé to zvládnou s pomocí SCCM, politik, skriptů a dalších automatizačních nástrojů.

Aktuální verzi PowerShellu lze zjistit z proměnné $PSVersionTable. Po aktualizaci by to mělo vypadat nějak takto:

Windows, PowerShell a dlouhé cesty

Nyní při použití rutin Get-ChildItem a podobně místo obvyklého Cesta budeme používat doslovná cesta.

Formát cesty se bude mírně lišit:

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

Pro usnadnění převodu cest z obvyklého formátu do formátu doslovná cesta můžete použít tuto funkci:

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

Vezměte prosím na vědomí, že při nastavování parametru doslovná cesta Nemůžete použít zástupné znaky (*, ? a tak dále).

Kromě parametru doslovná cesta, v aktualizované verzi rutiny PowerShell Get-ChildItem dostal parametr Hloubka, u kterého se dá nastavit hloubka vnoření pro rekurzivní vyhledávání, párkrát jsem ho použil a byl jsem spokojen.

Nyní se nemusíte bát, že váš PS skript sejde na dlouhé trnité cestě a nebude schopen vidět vzdálené soubory. Tento přístup mi například hodně pomohl při psaní skriptu pro resetování atributu „temporary“ souborů ve složkách DFSR. Ale to je jiný příběh, který se pokusím vyprávět v jiném článku. Těším se na vaše zajímavé komentáře a navrhuji, abyste se průzkumu zúčastnili.

Užitečné odkazy:
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

Průzkumu se mohou zúčastnit pouze registrovaní uživatelé. Přihlásit se, prosím.

Je pro vás problém dlouhých cest aktuální?

  • Ano

  • Bylo to relevantní, ale už bylo rozhodnuto

  • Překáží, ale ne moc

  • Nepřemýšlel jsem o tom, zdá se, že vše funguje

  • Ne

  • Jiné (prosím uveďte do komentáře)

Hlasovalo 155 uživatelů. 25 uživatelů se zdrželo hlasování.

Zdroj: www.habr.com

Přidat komentář