Uživatelské moduly PowerShellu mimo OneDrive
Uživatelské moduly PowerShellu se standardně ukládají do složky Dokumenty, což při jejím přesměrování do OneDrive může způsobovat konflikty s blokováním souborů, prodlužovat synchronizaci a komplikovat spouštění skriptů. Pouhá změna proměnné PSModulePath přitom instalační umístění modulů nezmění. Článek vysvětluje příčiny tohoto chování, dostupné náhradní možnosti a plánované řešení ze strany Microsoftu.

Popis problému
Moduly instalované pomocí Install-Module v kontextu CurrentUser se ve Windows standardně ukládají do systémové složky Dokumenty. Ve Windows PowerShell 5.1 jde o podsložku WindowsPowerShell\Modules, v PowerShell 7 o PowerShell\Modules. Pokud jsou Dokumenty přesměrované do OneDrive, vztahuje se synchronizace také na tyto složky s PowerShell moduly.
Toto uspořádání přináší dva problémy.
Prvním je synchronizační zátěž a závislost na místní dostupnosti souborů. Moduly a jejich závislosti mohou obsahovat vyšší stovky až tisíce souborů. Jejich instalace a aktualizace tak zbytečně zatěžují a prodlužují synchronizaci. Při použití funkce Files On-Demand navíc nemusí být soubory dostupné místně. První načtení modulu se může prodloužit o jejich stažení, případně skript selže, pokud soubory nelze stáhnout.
Volba Vždy ponechat na tomto zařízení řeší místní dostupnost, nikoli synchronizační zátěž nebo blokování souborů.
Druhým, pokud je v organizaci vynuceno blokování souborů PowerShellu na úrovni OneDrive (a SharePoint), uživatelé jsou neustále upozorňováni na soubory, kolidující s pravidly organizace pro synchronizaci souborů.
Požadovaný stav
Z výše uvedených důvodů, by měly být uživatelské moduly uložené mimo OneDrive, například v %LOCALAPPDATA%\PowerShell\Modules.
Nastavení má být možné nasadit hromadně, přičemž každý uživatel bude mít vlastní místní složku. Požadavkem je zachovat standardní instalaci a aktualizaci pomocí příkazů Install-Module -Scope CurrentUser a Update-Module, bez změn konfigurace OneDrive nebo přesměrování Dokumentů.
Zjištění
Instalační umístění používané příkazem Install-Module -Scope CurrentUser určuje správce modulů PowerShellGet. V jeho kódu je pevně definovaný postup, který získá skutečné umístění složky Dokumenty a připojí podsložku WindowsPowerShell\Modules nebo PowerShell\Modules podle používané edice PowerShellu. Není tedy pevně zapsaná celá absolutní cesta, ale způsob jejího sestavení.
Tato instalační cesta se sestavuje při inicializaci modulu PowerShellGet. V každé nové relaci PowerShellu, ve které se tento modul načte, se proto znovu určí podle stejného pravidla. Technicky nejde nutně o okamžik spuštění samotného PowerShellu, ale o načtení jeho správce modulů.
Proměnná prostředí PSModulePath naproti tomu určuje pouze umístění pro vyhledávání a načítání modulů. PowerShell její výslednou hodnotu sestavuje při spuštění. Přestože ji lze upravit dočasně i trvale prostřednictvím registru, PowerShellGet z ní instalační cíl pro CurrentUser nevybírá. Při instalaci použije svou samostatně sestavenou cestu pod Dokumenty, nikoli vlastní cestu přidanou do této proměnné.
Změnou PSModulePath proto nelze přesměrovat instalaci uživatelských modulů například do %LOCALAPPDATA%\PowerShell\Modules. Při zachování umístění Dokumentů nenabízí PowerShellGet 2.x podporované konfigurační nastavení, kterým by bylo možné tento vlastní instalační cíl určit.
Původně navržený skript pro úpravu PSModulePath tedy požadavek nesplňuje. Zajistí dostupnost modulů uložených v jiné složce, ale nezmění místo, kam je příkaz Install-Module -Scope CurrentUser instaluje.
Náhradní možnosti
Náhradním řešením je instalace s rozsahem AllUsers do složky Program Files, tedy mimo OneDrive. Zachovává standardní instalaci a aktualizaci modulů, ale vyžaduje zvýšená oprávnění. Moduly jsou společné pro uživatele počítače, nikoli oddělené pro jednotlivé uživatele.
Další možností je ukládání modulů do vlastní uživatelské složky pomocí Save-Module -Path a její přidání do PSModulePath. Ve skriptech pak lze moduly načítat běžně podle názvu, bez uvádění úplné cesty a bez vytváření kopií u každého skriptu. Tato varianta ale mění postup získávání a aktualizace modulů: takto uložené moduly nelze spravovat běžným Update-Module jako moduly instalované pomocí Install-Module.
Ani jedna varianta proto nesplňuje všechny původní požadavky.
Plánované řešení
Microsoft plánuje možnost změnit umístění uživatelského obsahu PowerShellu mimo Dokumenty. Změna má řešit právě problémy se synchronizací prostřednictvím OneDrive a zahrnuje kromě modulů také profily a další uživatelský obsah.
Původní plán z dubna 2025 počítal s experimentální funkcí během vývoje PowerShellu 7.6. Aktualizovaný plán z února 2026 ji přesunul do vývoje PowerShellu 7.7 pod označením PSUserContentPath relocation. Jde o plán, nikoli záruku dostupnosti v konkrétní finální verzi. Oznámení se netýká Windows PowerShellu 5.1.
Uvedená změna by se mohla dočkat nasazení snad během tohoto roku v rámci zmíněné plánované nové verze PowerShellu 7.7.
Závěr
Problém zatím nelze nijak vyřešit, buď řešit hromadně skrze scope AllUsers a nebo mít vyhrazenou složku, ale počítat s tím, že instalace modulů ve výchozím stavu používá složku v Dokumenty … a také nutnost počítat s kostrbatým řešením z pohledu správy a aktualizací těchto modulů nesystémově.
Odkazy
- User context, don’t install to %OneDriveCommercial% if OneDrive for Business Known Folder Move (KFM) is enabled #627 (anglicky)
- PowerShell, OpenSSH, and DSC team investments for 2026 (anglicky)
