Summary: Microsoft Scripting Guy Ed Wilson teaches how to accelerate work in the Windows PowerShell console with PSDrives.
Hey, Scripting Guy! I noticed in one of your screen shots that you were running the script from a rather deeply nested path of c:\data\ScriptingGuys\2011\HSG-1-3-11. I remember thinking what a silly path for a PowerShell kind of guy to use. About the only thing that you could have done to make matters worse on yourself would have been to have put a space in Scripting Guys, and maybe chuck the entire thing in your documents folder in your profile. What gives? Is there not a better way to handle paths in Windows PowerShell? Am I limited to chucking everything into a bin folder that I add to my path, or have an unwieldy long path to deal with?
— MC
Hello MC, Microsoft Scripting Guy Ed Wilson here. You know, one of the fun things about traveling with Dr. Scripto is that he is world famous. When I was doing the fashion photographer thing, and we were having our photo shoot, dozens of people came up to watch the proceedings. During our tour of the Castillo De San Marcosk, Carl “Fritz” Bertoch, a Visitor Use Assistant for the U.S. Department of the Interior, came up and wanted his picture taken. Being the laid back person that he is, Dr. Scripto was more than happy to oblige.
MC, just like having your picture taken with Dr. Scripto, sometimes all it takes is to ask. The reason I have such a convoluted path is that it helps with backups (all my data is in a data folder) and it also helps with organizing all the materials for a weeks’ worth of Hey, Scripting Guy! posts (documents, scripts, figures, and various notes). I have written a script that I use to create all my folders for each year.
Dealing with scripts and convoluted paths is not too terribly difficult in Windows 7 because I can drag-and-drop a script to the Windows PowerShell console and run the script unless the Windows PowerShell console is elevated (running with Admin rights). If I have to edit a script, I can drag-and-drop the script onto the Windows PowerShell ISE and that will populate a window so I can run and edit as needed.
When I was working on my Windows PowerShell 2.0 Best Practices book, I used a PS drive to shorten paths and to make it easier to access the scripts for that project. To create a PS drive, I use the New-PSDrive cmdlet. When using the New-PSDrive cmdlet, I have to specify at least three things: the provider name, the root location for the new drive, and a name for the drive. For now, I will use the FileSystem provider because that provider will allow me to access my hard drive. One of the cool things about the New-PSDrive cmdlet is that I can create a “PowerShell drive” that has a root on a file share, a registry hive, a certificate store, or some other location. It all depends on what providers are installed on the system. The command to create a PS Drive named HSG that has the root of C:\data\ScriptingGuys\2011 using the filesystem provider appears here.
New-PSDrive -PSProvider filesystem -Root C:\data\ScriptingGuys\2011 -Name HSG
When this command is finished, it returns an instance of the PSDriveInfo class. This is seen here.
PS C:\> New-PSDrive -PSProvider filesystem -Root C:\data\ScriptingGuys\2010 -Name HSG10 | Get-Member
TypeName: System.Management.Automation.PSDriveInfo
Name MemberType Definition
—- ———- ———-
CompareTo Method int CompareTo(System.Management.Automation.PSDriveInfo drive), in…
Equals Method bool Equals(System.Object obj), bool Equals(System.Management.Aut…
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
Credential Property System.Management.Automation.PSCredential Credential {get;}
CurrentLocation Property System.String CurrentLocation {get;set;}
Description Property System.String Description {get;set;}
Name Property System.String Name {get;}
Provider Property System.Management.Automation.ProviderInfo Provider {get;}
Root Property System.String Root {get;}
Free ScriptProperty System.Object Free {get=## Ensure that this is a FileSystem drive…
Used ScriptProperty System.Object Used {get=## Ensure that this is a FileSystem drive…
Because the object returns, the properties display to the Windows PowerShell console every time that a new PS Drive is created. Most of the time, I like seeing the PSDriveInfo object because it provides confirmation that the command succeeded. This is shown in the following figure.
If I decide, such as I did when I was working on my book, to add the PSDrive to my Windows PowerShell profile, I do not want the distraction of a bunch of text cluttering my screen. Therefore, I pipeline the PSDriveInfo object to the Out-Null cmdlet and discard the PSDriveInfo object. Pipelining return objects to the Out-Null cmdlet does not affect the operation of the command. The command to do this appears here.
New-PSDrive -PSProvider filesystem -Root C:\data\ScriptingGuys\2011 -Name HSG | Out-Null
At this point, MC, you are probably asking yourself, “This is all nice to know stuff, but how do I use the newly created PS Drive?” It is as easy to use a PS Drive as it is to use any other drive on your system. In fact, within the Windows PowerShell environment the C and D drives on my computer show up as PS Drives. I use the Get-PSDrive cmdlet to obtain information about PS Drives. The output appearing here shows this technique.
PS C:\> Get-PSDrive | sort provider
Name Used (GB) Free (GB) Provider Root CurrentLoc
ation
—- ——— ——— ——– —- ———-
Alias Alias
Env Environment
HSG 88.38 FileSystem C:\data\ScriptingGuys\2011
D FileSystem D:\
C 59.13 88.38 FileSystem C:\
Function Function
HKLM Registry HKEY_LOCAL_MACHINE
HKCU Registry HKEY_CURRENT_USER
Variable Variable
cert Certificate \
WSMan WSMan
As seen in the following figure I can use the same commands with my new HSG PS Drive that I use with the C or the D drive.
The cd command is an alias for the Set-Location Windows PowerShell cmdlet, and dir is an alias for the Get-ChildItem cmdlet. Navigating PS Drives is such a fundamental task, that there are three aliases (by default) for these cmdlets. I use the Get-Alias cmdlet and the definition parameter to find aliases for cmdlets I use a lot. Here is the command and the associated output.
PS HSG:\> Get-Alias -Definition Get-ChildItem
CommandType Name Definition
———– —- ———-
Alias dir Get-ChildItem
Alias gci Get-ChildItem
Alias ls Get-ChildItem
PS HSG:\> Get-Alias -Definition Set-Location
CommandType Name Definition
———– —- ———-
Alias cd Set-Location
Alias chdir Set-Location
Alias sl Set-Location
PS HSG:\>
Of course, I do not have to set my location to the HSG PS Drive to obtain a directory listing. I can do it from the C drive as shown here.
PS C:\> dir hsg:
Directory: C:\data\ScriptingGuys\2011
Mode LastWriteTime Length Name
—- ————- —— —-
d—- 1/14/2011 2:55 PM HSG_1_10_11
d—- 1/14/2011 2:55 PM HSG_1_17_11
<output truncated>
PS C:\>
Two other neglected cmdlets are Push-Location and Pop-Location. Push-Location stores the current location, and Pop-Location returns to the stored location. When I have to change to a particular location to do some work, I frequently like to push my current location onto the stack, do my work, and then pop back to my previous location. This appears here where I use the aliases pushd and popd. When confronted with an alias I may not understand, I use the Get-Alias cmdlet to look up the definition (that is also illustrated).
PS C:\> pushd
PS C:\> sl hsg:
PS HSG:\> popd
PS C:\> Get-Alias pushd
CommandType Name Definition
———– —- ———-
Alias pushd Push-Location
PS C:\> Get-Alias popd
CommandType Name Definition
———– —- ———-
Alias popd Pop-Location
PS C:\>
MC, that is all there is to using the New-PSDrive cmdlet. Stay tuned tomorrow when I answer more burning PowerShell questions on Quick Hits Friday.
I invite you to follow me on Twitter or Facebook. If you have any questions, send email to me at scripter@microsoft.com or post them on the Official Scripting Guys Forum. See you tomorrow. Until then, peace.
Ed Wilson, Microsoft Scripting Guy
0 comments