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:
- na serveru je složka, například D:DataSharedAccounting, která je sdílena přes SMB a mapuje se uživatelům jako síťový disk S; uživatelé vytvářejí soubory, které nebudou moci přečíst administrátoři/scripty při místním přístupu ze serveru, protože absolutní cesta se stává delší než síťová;
- ;
- ;
- při migraci dat z jiných systémů, které mají méně přísná omezení na délku cesty, se část z nich v novém prostředí stane nedostupnou bez tance s bubny;
- ;
- atd...
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ě) ).
Rád bych také upozornil na velmi užitečnou utilitu, která mi mnohokrát pomohla . 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 . I přes svůj solidní věk se osvědčil na Windows 2012 R2. 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 .
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.
- 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 , další informace si přečtěte .
- a nainstalovat Windows Management Framework 5.1
- 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:

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:
Pouze registrovaní uživatelé se mohou účastnit ankety. , 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
