2014-09-07 13 views
8

Là quản trị viên, tôi muốn thay đổi vị trí mặc định của các thư mục đặc biệt (Documents, Music, Downloads ...) thành một đường dẫn khác. Tôi có thể làm điều này bằng tay, nhưng tôi muốn có một kịch bản PowerShell để làm điều đó.Đặt vị trí của các thư mục đặc biệt bằng PowerShell

Có bất kỳ đối tượng PS nào cung cấp các chức năng để thực hiện việc này không? Tôi làm nó như thế nào? Cảm ơn.

Trả lời

17

PowerShell không có lệnh ghép ngắn cho phép bạn làm điều đó ra khỏi hộp (theo như tôi biết), nhưng bạn có thể sử dụng P/Gọi để gọi hàm SHSetKnownFolderPath. Tôi tạo ra một chức năng bao bọc gọi là Set-KnownFolderPath nào đó:

<# 
.SYNOPSIS 
    Sets a known folder's path using SHSetKnownFolderPath. 
.PARAMETER Folder 
    The known folder whose path to set. 
.PARAMETER Path 
    The path. 
#> 
function Set-KnownFolderPath { 
    Param (
      [Parameter(Mandatory = $true)] 
      [ValidateSet('AddNewPrograms', 'AdminTools', 'AppUpdates', 'CDBurning', 'ChangeRemovePrograms', 'CommonAdminTools', 'CommonOEMLinks', 'CommonPrograms', 'CommonStartMenu', 'CommonStartup', 'CommonTemplates', 'ComputerFolder', 'ConflictFolder', 'ConnectionsFolder', 'Contacts', 'ControlPanelFolder', 'Cookies', 'Desktop', 'Documents', 'Downloads', 'Favorites', 'Fonts', 'Games', 'GameTasks', 'History', 'InternetCache', 'InternetFolder', 'Links', 'LocalAppData', 'LocalAppDataLow', 'LocalizedResourcesDir', 'Music', 'NetHood', 'NetworkFolder', 'OriginalImages', 'PhotoAlbums', 'Pictures', 'Playlists', 'PrintersFolder', 'PrintHood', 'Profile', 'ProgramData', 'ProgramFiles', 'ProgramFilesX64', 'ProgramFilesX86', 'ProgramFilesCommon', 'ProgramFilesCommonX64', 'ProgramFilesCommonX86', 'Programs', 'Public', 'PublicDesktop', 'PublicDocuments', 'PublicDownloads', 'PublicGameTasks', 'PublicMusic', 'PublicPictures', 'PublicVideos', 'QuickLaunch', 'Recent', 'RecycleBinFolder', 'ResourceDir', 'RoamingAppData', 'SampleMusic', 'SamplePictures', 'SamplePlaylists', 'SampleVideos', 'SavedGames', 'SavedSearches', 'SEARCH_CSC', 'SEARCH_MAPI', 'SearchHome', 'SendTo', 'SidebarDefaultParts', 'SidebarParts', 'StartMenu', 'Startup', 'SyncManagerFolder', 'SyncResultsFolder', 'SyncSetupFolder', 'System', 'SystemX86', 'Templates', 'TreeProperties', 'UserProfiles', 'UsersFiles', 'Videos', 'Windows')] 
      [string]$KnownFolder, 

      [Parameter(Mandatory = $true)] 
      [string]$Path 
    ) 

    # Define known folder GUIDs 
    $KnownFolders = @{ 
     'AddNewPrograms' = 'de61d971-5ebc-4f02-a3a9-6c82895e5c04'; 
     'AdminTools' = '724EF170-A42D-4FEF-9F26-B60E846FBA4F'; 
     'AppUpdates' = 'a305ce99-f527-492b-8b1a-7e76fa98d6e4'; 
     'CDBurning' = '9E52AB10-F80D-49DF-ACB8-4330F5687855'; 
     'ChangeRemovePrograms' = 'df7266ac-9274-4867-8d55-3bd661de872d'; 
     'CommonAdminTools' = 'D0384E7D-BAC3-4797-8F14-CBA229B392B5'; 
     'CommonOEMLinks' = 'C1BAE2D0-10DF-4334-BEDD-7AA20B227A9D'; 
     'CommonPrograms' = '0139D44E-6AFE-49F2-8690-3DAFCAE6FFB8'; 
     'CommonStartMenu' = 'A4115719-D62E-491D-AA7C-E74B8BE3B067'; 
     'CommonStartup' = '82A5EA35-D9CD-47C5-9629-E15D2F714E6E'; 
     'CommonTemplates' = 'B94237E7-57AC-4347-9151-B08C6C32D1F7'; 
     'ComputerFolder' = '0AC0837C-BBF8-452A-850D-79D08E667CA7'; 
     'ConflictFolder' = '4bfefb45-347d-4006-a5be-ac0cb0567192'; 
     'ConnectionsFolder' = '6F0CD92B-2E97-45D1-88FF-B0D186B8DEDD'; 
     'Contacts' = '56784854-C6CB-462b-8169-88E350ACB882'; 
     'ControlPanelFolder' = '82A74AEB-AEB4-465C-A014-D097EE346D63'; 
     'Cookies' = '2B0F765D-C0E9-4171-908E-08A611B84FF6'; 
     'Desktop' = 'B4BFCC3A-DB2C-424C-B029-7FE99A87C641'; 
     'Documents' = 'FDD39AD0-238F-46AF-ADB4-6C85480369C7'; 
     'Downloads' = '374DE290-123F-4565-9164-39C4925E467B'; 
     'Favorites' = '1777F761-68AD-4D8A-87BD-30B759FA33DD'; 
     'Fonts' = 'FD228CB7-AE11-4AE3-864C-16F3910AB8FE'; 
     'Games' = 'CAC52C1A-B53D-4edc-92D7-6B2E8AC19434'; 
     'GameTasks' = '054FAE61-4DD8-4787-80B6-090220C4B700'; 
     'History' = 'D9DC8A3B-B784-432E-A781-5A1130A75963'; 
     'InternetCache' = '352481E8-33BE-4251-BA85-6007CAEDCF9D'; 
     'InternetFolder' = '4D9F7874-4E0C-4904-967B-40B0D20C3E4B'; 
     'Links' = 'bfb9d5e0-c6a9-404c-b2b2-ae6db6af4968'; 
     'LocalAppData' = 'F1B32785-6FBA-4FCF-9D55-7B8E7F157091'; 
     'LocalAppDataLow' = 'A520A1A4-1780-4FF6-BD18-167343C5AF16'; 
     'LocalizedResourcesDir' = '2A00375E-224C-49DE-B8D1-440DF7EF3DDC'; 
     'Music' = '4BD8D571-6D19-48D3-BE97-422220080E43'; 
     'NetHood' = 'C5ABBF53-E17F-4121-8900-86626FC2C973'; 
     'NetworkFolder' = 'D20BEEC4-5CA8-4905-AE3B-BF251EA09B53'; 
     'OriginalImages' = '2C36C0AA-5812-4b87-BFD0-4CD0DFB19B39'; 
     'PhotoAlbums' = '69D2CF90-FC33-4FB7-9A0C-EBB0F0FCB43C'; 
     'Pictures' = '33E28130-4E1E-4676-835A-98395C3BC3BB'; 
     'Playlists' = 'DE92C1C7-837F-4F69-A3BB-86E631204A23'; 
     'PrintersFolder' = '76FC4E2D-D6AD-4519-A663-37BD56068185'; 
     'PrintHood' = '9274BD8D-CFD1-41C3-B35E-B13F55A758F4'; 
     'Profile' = '5E6C858F-0E22-4760-9AFE-EA3317B67173'; 
     'ProgramData' = '62AB5D82-FDC1-4DC3-A9DD-070D1D495D97'; 
     'ProgramFiles' = '905e63b6-c1bf-494e-b29c-65b732d3d21a'; 
     'ProgramFilesX64' = '6D809377-6AF0-444b-8957-A3773F02200E'; 
     'ProgramFilesX86' = '7C5A40EF-A0FB-4BFC-874A-C0F2E0B9FA8E'; 
     'ProgramFilesCommon' = 'F7F1ED05-9F6D-47A2-AAAE-29D317C6F066'; 
     'ProgramFilesCommonX64' = '6365D5A7-0F0D-45E5-87F6-0DA56B6A4F7D'; 
     'ProgramFilesCommonX86' = 'DE974D24-D9C6-4D3E-BF91-F4455120B917'; 
     'Programs' = 'A77F5D77-2E2B-44C3-A6A2-ABA601054A51'; 
     'Public' = 'DFDF76A2-C82A-4D63-906A-5644AC457385'; 
     'PublicDesktop' = 'C4AA340D-F20F-4863-AFEF-F87EF2E6BA25'; 
     'PublicDocuments' = 'ED4824AF-DCE4-45A8-81E2-FC7965083634'; 
     'PublicDownloads' = '3D644C9B-1FB8-4f30-9B45-F670235F79C0'; 
     'PublicGameTasks' = 'DEBF2536-E1A8-4c59-B6A2-414586476AEA'; 
     'PublicMusic' = '3214FAB5-9757-4298-BB61-92A9DEAA44FF'; 
     'PublicPictures' = 'B6EBFB86-6907-413C-9AF7-4FC2ABF07CC5'; 
     'PublicVideos' = '2400183A-6185-49FB-A2D8-4A392A602BA3'; 
     'QuickLaunch' = '52a4f021-7b75-48a9-9f6b-4b87a210bc8f'; 
     'Recent' = 'AE50C081-EBD2-438A-8655-8A092E34987A'; 
     'RecycleBinFolder' = 'B7534046-3ECB-4C18-BE4E-64CD4CB7D6AC'; 
     'ResourceDir' = '8AD10C31-2ADB-4296-A8F7-E47C972'; 
     'RoamingAppData' = '3EB685DB-65F9-4CF6-A03A-E3EF65729F3D'; 
     'SampleMusic' = 'B250C668-F57D-4EE1-A63C-290EE7D1AA1F'; 
     'SamplePictures' = 'C4900540-2379-4C75-844B-64E6FAF8716B'; 
     'SamplePlaylists' = '15CA69B3-30EE-49C1-ACE1-6B5EC372AFB5'; 
     'SampleVideos' = '859EAD94-2E85-48AD-A71A-0969CB56A6CD'; 
     'SavedGames' = '4C5C32FF-BB9D-43b0-B5B4-2D72E54EAAA4'; 
     'SavedSearches' = '7d1d3a04-debb-4115-95cf-2f29da2920da'; 
     'SEARCH_CSC' = 'ee32e446-31ca-4aba-814f-a5ebd2fd6d5e'; 
     'SEARCH_MAPI' = '98ec0e18-2098-4d44-8644-66979315a281'; 
     'SearchHome' = '190337d1-b8ca-4121-a639-6d472d16972a'; 
     'SendTo' = '8983036C-27C0-404B-8F08-102D10DCFD74'; 
     'SidebarDefaultParts' = '7B396E54-9EC5-4300-BE0A-2482EBAE1A26'; 
     'SidebarParts' = 'A75D362E-50FC-4fb7-AC2C-A8BEAA314493'; 
     'StartMenu' = '625B53C3-AB48-4EC1-BA1F-A1EF4146FC19'; 
     'Startup' = 'B97D20BB-F46A-4C97-BA10-5E3608430854'; 
     'SyncManagerFolder' = '43668BF8-C14E-49B2-97C9-747784D784B7'; 
     'SyncResultsFolder' = '289a9a43-be44-4057-a41b-587a76d7e7f9'; 
     'SyncSetupFolder' = '0F214138-B1D3-4a90-BBA9-27CBC0C5389A'; 
     'System' = '1AC14E77-02E7-4E5D-B744-2EB1AE5198B7'; 
     'SystemX86' = 'D65231B0-B2F1-4857-A4CE-A8E7C6EA7D27'; 
     'Templates' = 'A63293E8-664E-48DB-A079-DF759E0509F7'; 
     'TreeProperties' = '5b3749ad-b49f-49c1-83eb-15370fbd4882'; 
     'UserProfiles' = '0762D272-C50A-4BB0-A382-697DCD729B80'; 
     'UsersFiles' = 'f3ce0f7c-4901-4acc-8648-d5d44b04ef8f'; 
     'Videos' = '18989B1D-99B5-455B-841C-AB7C74E4DDFC'; 
     'Windows' = 'F38BF404-1D43-42F2-9305-67DE0B28FC23'; 
    } 

    # Define SHSetKnownFolderPath if it hasn't been defined already 
    $Type = ([System.Management.Automation.PSTypeName]'KnownFolders').Type 
    if (-not $Type) { 
     $Signature = @' 
[DllImport("shell32.dll")] 
public extern static int SHSetKnownFolderPath(ref Guid folderId, uint flags, IntPtr token, [MarshalAs(UnmanagedType.LPWStr)] string path); 
'@ 
     $Type = Add-Type -MemberDefinition $Signature -Name 'KnownFolders' -Namespace 'SHSetKnownFolderPath' -PassThru 
    } 

    # Validate the path 
    if (Test-Path $Path -PathType Container) { 
     # Call SHSetKnownFolderPath 
     return $Type::SHSetKnownFolderPath([ref]$KnownFolders[$KnownFolder], 0, 0, $Path) 
    } else { 
     throw New-Object System.IO.DirectoryNotFoundException "Could not find part of the path $Path." 
    } 
} 

Sử dụng nó như thế này:

Set-KnownFolderPath -KnownFolder 'Desktop' -Path 'C:\' 
+0

Wow, man. Đây là câu trả lời! – SuperJMN

+2

Bạn nên đặt tên cho nó là 'Set-KnownFolderPath' và có thể gắn một thuộc tính' [ValidateSet ("AddNewPrograms", "AdminTools", ...)] vào tham số '$ KnownFolder' ;-) – Jaykul

+1

@Jaykul Hoàn toàn đúng, cảm ơn cả hai đề xuất. Cũng thêm Test-Path để đảm bảo thư mục tồn tại. –

1

Đây thực sự là một chức năng tuyệt vời! Tuy nhiên, tôi thay đổi nó một chút để sử dụng riêng của tôi, có lẽ bạn có thể tìm thấy điều này hữu ích là tốt.

# Validate the path 
    if(!(Test-Path $Path -PathType Container)) 
    { 
    New-Item -Path $Path -type Directory -Force 
    } 

# Call SHSetKnownFolderPath 
$Type::SHSetKnownFolderPath([ref]$KnownFolders[$KnownFolder], 0, 0, $Path) 
attrib +r $Path 

$Leaf = Split-Path -Path "$Path" -Leaf 
Move-Item "$HOME\$Leaf\*" $Path 
# rd $HOME\$Leaf -recurse -Force 

Như bạn có thể thấy ở đây, trước tiên tôi kiểm tra sự tồn tại của đường dẫn và tạo đường dẫn nếu nó không tồn tại.

Tôi đã bỏ qua lệnh "trả về" để tôi vẫn có thể sử dụng biến $ Path. Với lệnh attrib, bạn có thể cung cấp cho thư mục đặc biệt đó là biểu tượng ban đầu. Cuối cùng, tôi di chuyển tất cả các tệp hiện có từ vị trí cũ sang vị trí cũ. Bạn cũng có thể tùy ý xóa thư mục cũ, mà tôi khuyên bạn không nên có các thư mục đặc biệt kép trong Tập tin Người dùng.

Điều khó khăn duy nhất với điều này là Move-Item giả định vị trí cũ là biến $ HOME. Ngoài ra, nếu bạn sử dụng hàm để thay đổi, hãy nói thư mục Documents là C: \ Users \ John \ Documents, nó cũng sẽ loại bỏ nội dung của thư mục đó, vì các dòng cuối cùng của mã sẽ xóa biến thư mục $ HOME-special.

Nhưng có lẽ ai đó có thể tìm thấy giải pháp thanh lịch hơn cho trở ngại đó. Cảm ơn một lần nữa cho viên đá quý này của một chức năng!

+0

Trong bài đăng của bạn, bạn có thể kết thúc bằng 2 dấu cách - theo cách này, dòng tiếp theo trong Markdown là dòng tiếp theo trong bài đăng của bạn sau khi hiển thị. – GingerPlusPlus

Các vấn đề liên quan