Understanding Providers
Most computer systems are used to store data, often in a structure such as a file system. Because of the amount of data stored in these structures, processing and finding information can be unwieldy. Most shells have interfaces, or providers, for interacting with data stores in a predictable, set manner. PowerShell also has a set of providers for presenting the contents of data stores through a core set of cmdlets. You can then use these cmdlets to browse, navigate, and manipulate data from stores through a common interface. To get a list of the core cmdlets, use the following command:
PS C:\> help about_core_commands ... ChildItem CMDLETS Get-ChildItem CONTENT CMDLETS Add-Content Clear-Content Get-Content Set-Content DRIVE CMDLETS Get-PSDrive New-PSDrive Remove-PSDrive ITEM CMDLETS Clear-Item Copy-Item Get-Item Invoke-Item Move-Item New-Item Remove-Item Rename-Item Set-Item LOCATION CMDLETS Get-Location Pop-Location Push-Location Set-Location PATH CMDLETS Join-Path Convert-Path Split-Path Resolve-Path Test-Path PROPERTY CMDLETS Clear-ItemProperty Copy-ItemProperty Get-ItemProperty Move-ItemProperty New-ItemProperty Remove-ItemProperty Rename-ItemProperty Set-ItemProperty PROVIDER CMDLETS Get-PSProvider PS C:\> |
To view built-in PowerShell providers, use the following command:
PS C:\> get-psprovider Name Capabilities Drives ---- ------------ ------ Alias ShouldProcess {Alias} Environment ShouldProcess {Env} FileSystem Filter, ShouldProcess {C, D, E, F...} Function ShouldProcess {Function} Registry ShouldProcess {HKLM, HKCU} Variable ShouldProcess {Variable} Certificate ShouldProcess {cert} PS C:\> |
The preceding list displays not only built-in providers, but also the drives each provider currently supports. A drive is an entity that a provider uses to represent a data store through which data is made available to the PowerShell session. For example, the Registry provider creates a PowerShell drive for the HKEY_LOCAL_MACHINE and HKEY_CURRENT_USER Registry hives.
To see a list of all current PowerShell drives, use the following command:
PS C:\> get-psdrive Name Provider Root ---- -------- ---- Alias Alias C FileSystem C:cert Certificate D FileSystem D:E FileSystem E:Env Environment F FileSystem F:Function Function G FileSystem G:HKCU Registry HKEY_CURRENT_USER HKLM Registry HKEY_LOCAL_MACHINE U FileSystem U Variable Variable PS C:\> |
Accessing Drives and Data
One way to access PowerShell drives and their data is with the Set-Location cmdlet. This cmdlet, shown in the following example, changes the working location to another specified location that can be a directory, subdirectory, location stack, or Registry location:
PS C:\> set-location hklm: PS HKLM:\> set-location software\microsoft\windows PS HKLM:\software\microsoft\windows> |
Next, use the Get-ChildItem cmdlet to list the subkeys under the Windows key:
PS HKLM:\software\microsoft\windows> get-childitem Hive: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\software\micros oft\windows SKC VC Name Property --- -- ---- -------- 55 13 CurrentVersion {DevicePath, MediaPathUnexpanded, SM_... 0 16 Help {PINTLPAD.HLP, PINTLPAE.HLP, IMEPADEN... 0 36 Html Help {PINTLGNE.CHM, PINTLGNT.CHM, PINTLPAD... 1 0 ITStorage {} 0 0 Shell {} PS HKLM:\software\microsoft\windows> |
Note that with a Registry drive, the Get-ChildItem cmdlet lists only the subkeys under a key, not the actual Registry values. This is because Registry values are treated as properties for a key rather than a valid item. To retrieve these values from the Registry, you use the Get-ItemProperty cmdlet, as shown in this example:
PS HKLM:\software\microsoft\windows> get-itemproperty currentversion PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHI NE\software\microsoft\windows\currentversion PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHI NE\software\microsoft\windows PSChildName : currentversion PSDrive : HKLM PSProvider : Microsoft.PowerShell.Core\Registry DevicePath : C:\WINDOWS\inf MediaPathUnexpanded : C:\WINDOWS\Media SM_GamesName : Games SM_ConfigureProgramsName : Set Program Access and Defaults ProgramFilesDir : C:\Program Files CommonFilesDir : C:\Program Files\Common Files ProductId : 76487-OEM-0011903-00101 WallPaperDir : C:\WINDOWS\Web\Wallpaper MediaPath : C:\WINDOWS\Media ProgramFilesPath : C:\Program Files SM_AccessoriesName : Accessories PF_AccessoriesName : Accessories (default) : PS HKLM:\software\microsoft\windows> |
As with the Get-Process command, the data returned is a collection of objects. You can modify these objects further to produce the output you want, as this example shows:
PS HKLM:\software\microsoft\windows> get-itemproperty currentversion | select ProductId ProductId --------- 76487-OEM-XXXXXXX-XXXXX PS HKLM:\software\microsoft\windows> |
Accessing data from a FileSystem drive is just as simple. The same type of command logic is used to change the location and display the structure:
PS HKLM:\software\microsoft\windows> set-location c: PS C:\> set-location "C:\WINDOWS\system32\windowspowershell\v1.0" PS C:\WINDOWS\system32\windowspowershell\v1.0> get-childitem about_a* Directory: Microsoft.PowerShell.Core\FileSystem::C:\WINDOWS\system32\window spowershell\v1.0 Mode LastWriteTime Length Name ---- ------------- ------ ---- ----- 9/8/2006 2:10 AM 5662 about_alias.help.txt ----- 9/8/2006 2:10 AM 3504 about_arithmetic_operators.help.txt ----- 9/8/2006 2:10 AM 8071 about_array.help.txt ----- 9/8/2006 2:10 AM 15137 about_assignment_operators.help.txt ----- 9/8/2006 2:10 AM 5622 about_associative_array.help.txt ----- 9/8/2006 2:10 AM 3907 about_automatic_variables.help.txt ... PS C:\WINDOWS\system32\windowspowershell\v1.0> |
What's different is that data is stored in an item instead of being a property of that item. To retrieve data from an item, use the Get-Content cmdlet, as shown in this example:
PS C:\WINDOWS\system32\windowspowershell\v1.0> get-content about_Alias.help.txt TOPIC Aliases SHORT DESCRIPTION Using pseudonyms to refer to cmdlet names in the Windows PowerShell LONG DESCRIPTION An alias is a pseudonym, or "nickname," that you can assign to a cmdlet so that you can use the alias in place of the cmdlet name. The Windows PowerShell interprets the alias as though you had entered the actual cmdlet name. For example, suppose that you want to retrieve today's date for the year 1905. Without an alias, you would use the following command: Get-Date -year 1905 ... PS C:\WINDOWS\system32\windowspowershell\v1.0> |
Mounting a Drive
PowerShell drives can be created and removed, which is handy when you're working with a location or set of locations frequently. Instead of having to change the location or use an absolute path, you can create new drives (also referred to as "mounting a drive" in PowerShell) as shortcuts to those locations. To do this, use the New-PSDrive cmdlet, shown in the following example:
PS C:\> new-psdrive -name PSScripts -root D:\Dev\Scripts -psp FileSystem Name Provider Root CurrentLocation ---- -------- ---- --------------- PSScripts FileSystem D:\Dev\Scripts PS C:\> get-psdrive Name Provider Root CurrentLocation ---- -------- ---- --------------- Alias Alias C FileSystem C:cert Certificate D FileSystem D:E FileSystem E:Env Environment F FileSystem F:Function Function G FileSystem G:HKCU Registry HKEY_CURRENT_USER software HKLM Registry HKEY_LOCAL_MACHINE ...crosoft\windows PSScripts FileSystem D:\Dev\Scripts U FileSystem U:Variable Variable PS C:\> |
To remove a drive, use the Remove-PSDrive cmdlet, as shown here:
PS C:\> remove-psdrive -name PSScripts PS C:\> get-psdrive Name Provider Root CurrentLocation ---- -------- ---- --------------- Alias Alias C FileSystem C:cert Certificate D FileSystem D:E FileSystem E:Env Environment F FileSystem F:Function Function G FileSystem G:HKCU Registry HKEY_CURRENT_USER software HKLM Registry HKEY_LOCAL_MACHINE ...crosoft\windows U FileSystem U:Variable Variable PS C:\> |