<# .SYNOPSIS Redirect user folders to a new location .EXAMPLE Set-KnownFolderPath -KnownFolder Desktop -Path "$env:SystemDrive:\Desktop" #> function Global:Set-KnownFolderPath { [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [ValidateSet("Desktop", "Documents", "Downloads", "Music", "Pictures", "Videos")] [string] $KnownFolder, [Parameter(Mandatory = $true)] [string] $Path ) $KnownFolders = @{ "Desktop" = @("B4BFCC3A-DB2C-424C-B029-7FE99A87C641") "Documents" = @("FDD39AD0-238F-46AF-ADB4-6C85480369C7", "f42ee2d3-909f-4907-8871-4c22fc0bf756") "Downloads" = @("374DE290-123F-4565-9164-39C4925E467B", "7d83ee9b-2244-4e70-b1f5-5404642af1e4") "Music" = @("4BD8D571-6D19-48D3-BE97-422220080E43", "a0c69a99-21c8-4671-8703-7934162fcf1d") "Pictures" = @("33E28130-4E1E-4676-835A-98395C3BC3BB", "0ddd015d-b06c-45d5-8c4c-f59713854639") "Videos" = @("18989B1D-99B5-455B-841C-AB7C74E4DDFC", "35286a68-3c57-41a1-bbb1-0eae73d76c95") } $Signature = @{ Namespace = "WinAPI" Name = "KnownFolders" Language = "CSharp" CompilerParameters = $CompilerParameters MemberDefinition = @" [DllImport("shell32.dll")] public extern static int SHSetKnownFolderPath(ref Guid folderId, uint flags, IntPtr token, [MarshalAs(UnmanagedType.LPWStr)] string path); "@ } if (-not ("WinAPI.KnownFolders" -as [type])) { Add-Type @Signature } foreach ($GUID in $KnownFolders[$KnownFolder]) { [WinAPI.KnownFolders]::SHSetKnownFolderPath([ref]$GUID, 0, 0, $Path) } (Get-Item -Path $Path -Force).Attributes = "ReadOnly" }