Windows, PowerShell a dlouhé cesty

Windows, PowerShell a dlouhé cesty

Myslím, že jste se mnohokrát setkali s cestami jako je tato, stejně jako já. !!! Důležité____Nové____!!! Nemažte!!! Příkaz č. 98819-649-B ze 30. února 1985 o jmenování Kozlova Ivana Alexandroviche dočasně vykonávajícím povinnosti vedoucího směru pro podporu korporátních VIP klientů a organizaci obchodních schůzek v zákulisí.doc.

A často se takový dokument v systému Windows otevřít hned nepodaří. Někdo praktikuje workaround v podobě mapování disků, někdo používá správce souborů, které umí pracovat s dlouhými cestami: Far Manager, Total Commander a podobně. A mnozí s nostalgií sledovali, jak jejich vytvořený PS skript, do kterého vložili spoustu práce a který v testovacím prostředí fungoval skvěle, v produkčním prostředí bezmocně stěžoval na nesplnitelný úkol: Zadaná cesta, název souboru nebo obojí je příliš dlouhé. Úplný název souboru musí mít méně než 260 znaků a název složky méně než 248 znaků.
Jak se ukázalo, 260 znaků stačí „ne jen tak pro všechny“. Pokud vás zajímá, jak překročit povolené hranice - prosím ke čtení níže.

Toto jsou pouze některé z nešťastných následků omezení délky souborové cesty:

Malou odchylkou od tématu bych rád poznamenal, že pro DFS Replication není zvažovaný problém v článku strašný a soubory s dlouhými názvy úspěšně putují ze serveru na server (pokud samozřejmě vše ostatní děláte správně) udělali správně).

Rád bych také upozornil na velmi užitečnou utilitu, která mi mnohokrát pomohla robocopy. Není se jí také bála dlouhých cest a umí toho hodně. Pokud je úkol pouze o kopírování/přepravě souborových dat, můžete se na ní zastavit. Pokud je potřeba si pohrát se seznamy řízení přístupu v souborovém systému (DACL), podívejte se na subinacl. I přes svůj solidní věk se osvědčil na Windows 2012 R2. Tady jsou uvedeny způsoby použití.

Mě zajímalo naučit PowerShell pracovat s dlouhými cestami. S ním je to skoro jako v starém vtipu o Ivanovi Carovi a Vasilise Prekrasné.

Rychlý způsob

Přejít na Linux a nebavit se s Windows 10/2016/2019 a zapnout odpovídající nastavení skupinové politiky/pohrát se s registrem. Na tento způsob se nebudu podrobně zastavovat, protože na toto téma je v síti již spousta článků, například tento.

S ohledem na to, že většina firem má, mírně řečeno, mnoho neaktuálních verzí operačních systémů, je tento způsob rychlý jen na papíře, pokud samozřejmě nejste z těch šťastlivců, kteří mají málo historických systémů a mají Windows 10/2016/2019.

Dlouhý způsob

Tady je třeba hned říci, že změny se nedotknou chování Průzkumníka Windows, ale umožní používat dlouhé cesty v PowerShell cmdletech, jako jsou Get-Item, Get-ChildItem, Remove-Item a další.

Nejprve aktualizujeme PowerShell. To se dělá rychle.

  1. Aktualizujeme .NET Framework na verzi alespoň 4.5. Operační systém by měl být alespoň Windows 7 SP1/2008 R2. Aktuální verzi lze stáhnout zde, další informace si přečtěte tady.
  2. Stáhnout a nainstalovat Windows Management Framework 5.1
  3. Restartovat počítač.

Pracovití mohou provést popsané kroky ručně, lenoši - pomocí SCCM, politik, skriptů a jiných automatizačních nástrojů.

Aktuální verzi PowerShell lze zjistit z proměnné $PSVersionTable. Po aktualizaci by to mělo vypadat přibližně takto:

Windows, PowerShell a dlouhé cesty

Nyní při používání cmdletů Get-ChildItem a jemu podobných místo obvyklého Path budeme používat LiteralPath.

Formát cest bude mírně odlišný:

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

Pro usnadnění převodu cest z běžného formátu na formát LiteralPath 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"}
}

Mějte na paměti, že při zadávání parametru LiteralPath nelze používat zástupné znaky (*, ? atd.).

Kromě parametru LiteralPath, v nové verzi PowerShellu získal cmdlet Get-ChildItem parametr Depth, který umožňuje nastavit hloubku vnoření pro rekurzivní vyhledávání, použil jsem ho párkrát a byl jsem spokojen.

Nyní se nemusíte bát, že by váš PS skript sklouzl z dlouhé trnité cesty a nezjistil vzdálené soubory. Mně například tento přístup velmi pomohl při psaní skriptu na odstranění atributu „dočasný“ u souborů ve složkách DFSR. Ale to je už jiný příběh, o kterém se pokusím napsat v jiném článku. Očekávám zajímavé komentáře od vás a navrhuji, abyste se zúčastnili ankety.

Užitečné odkazy:
docs.microsoft.com/cs-cz/dotnet/api/microsoft.powershell.commands.contentcommandbase.literalpath?view=powershellsdk-1.1.0
docs.microsoft.com/cs-cz/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

Pouze registrovaní uživatelé se mohou účastnit ankety. Přihlaste se, prosím.

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

  • Ano

  • Byl aktuální, ale už jsem to vyřešil

  • Vadí, ale ne moc

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

  • Ne

  • Jiné (uvedete v komentářích)

Hlasovalo 155 uživatelů. Zdrželo se 25 uživatelů.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster