- <#
- .SYNOPSIS
- This script lists the special folders enumerated in System.Environment.SpecialFolder
- .DESCRIPTION
- This script first enumerates the SpecialFolder Enum. for each member, the script
- then looks up, and displays, the value of that folder.
- .NOTES
- File Name : Get-SpecialFolders.ps1
- Author : Thomas Lee - tfl@psp.co.uk
- Requires : PowerShell V2 CTP3
- .LINK
- This script posted to:
- http://www.pshscripts.blogspot.com
- MSDN Sample posted at:
- http://msdn.microsoft.com/en-us/library/system.environment.specialfolder.aspx
- .EXAMPLE
- PSH [C:\foo]: . 'E:\PowerShellScriptLib\System.Environment\Get-SpecialFolders.PS1'
- Folder Name Path
- ----------- -----------------------------------------------
- Desktop C:\Users\tfl\Desktop
- Programs C:\Users\tfl\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
- Personal C:\Users\tfl\Documents
- Personal C:\Users\tfl\Documents
- Favorites C:\Users\tfl\NetHood\Favorites
- Startup C:\Users\tfl\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
- Recent C:\Users\tfl\AppData\Roaming\Microsoft\Windows\Recent
- SendTo C:\Users\tfl\AppData\Roaming\Microsoft\Windows\SendTo
- StartMenu C:\Users\tfl\AppData\Roaming\Microsoft\Windows\Start Menu
- MyMusic C:\Users\tfl\Music
- DesktopDirectory C:\Users\tfl\Desktop
- MyComputer
- Templates C:\Users\tfl\AppData\Roaming\Microsoft\Windows\Templates
- ApplicationData C:\Users\tfl\AppData\Roaming
- LocalApplicationData C:\Users\tfl\AppData\Local
- InternetCache C:\Users\tfl\AppData\Local\Microsoft\Windows\Temporary Internet Files
- Cookies C:\Users\tfl\AppData\Roaming\Microsoft\Windows\Cookies
- History C:\Users\tfl\AppData\Local\Microsoft\Windows\History
- CommonApplicationData C:\ProgramData
- System C:\Windows\system32
- ProgramFiles C:\Program Files (x86)
- MyPictures C:\Users\tfl\Pictures
- CommonProgramFiles C:\Program Files (x86)\Common Files
- #>
- ##
- # Start of Script
- ##
- # Get the list of special folders
- $folders = [system.Enum]::GetValues([System.Environment+SpecialFolder])
- # Display these folders
- "Folder Name Path"
- "----------- -----------------------------------------------"
- foreach ($folder in $folders) {
- "{0,-22} {1,-15}" -f $folder,[System.Environment]::GetFolderPath($folder)
- }
- #End of Script
This blog contains PowerShell scripts, more PowerShell scripts and still more PowerShell scripts. Occasionally you may see some organisational posts.
I'm curious why you choose to return strings not objects (say [System.IO.DirectoryInfo]). I do love the enum trick though, they are my newest friends.
ReplyDeleteThanks for the comment.
ReplyDeleteI wrote the script simply to enumerate each Special Folder and where on my system it pointed to. I used the ENUM to work out what the set of special folder names were, then I called GetFolderPath to get the path for that folder, which I then display. If I'd wanted to do more things, then using the DirectoryInfo object might have been useful.
I borrowed code from this script. I know how the code works to get special folders. What I don't know is the syntax:
ReplyDelete$folders = [system.Enum]::GetValues([System.Environment+SpecialFolder])
Why System.Environment+SpecialFolder? What is different (other than that System.Environment.SpecialFolder does not work in this instance)?
I hate using code without understanding the syntax, though I know what it does, it is frustrating; I have never seen the syntax mentioned anywhere else.
David,
ReplyDeleteI'm not sure why this particular bit of syntax (i.e. using the "+") works and why normal dotting doesn't. I spent hours trying to figure this out and came up with little to explain it, other than this works. I'd love to know too, but I just chalk it up to 'you just have to know'!
Thanks for your comment.
The reason for the plus sign is due to public child classes. SpecialFolder is a public class nested within the System.Environment class. When referencing public child classes you have to use a + sign. We posted an article about this a while back on the PowerShell blog: http://blogs.msdn.com/b/powershell/archive/2009/08/27/plus-in-net-class-names.aspx
ReplyDelete-- Tom