views:

1285

answers:

6

I need to know, from within Powershell, if the current drive is a mapped drive or not.

Unfortunately, Get-PSDrive is not working "as expected":

PS:24 H:\temp
>get-psdrive  h

Name       Provider      Root      CurrentLocation
----       --------      ----      ---------------
H          FileSystem    H:\          temp

but in MS-Dos "net use" shows that H: is really a mapped network drive:

New connections will be remembered.

Status       Local     Remote                    Network
-------------------------------------------------------------------------------
OK           H:        \\spma1fp1\JARAVJ$        Microsoft Windows Network

The command completed successfully.

What I want to do is to get the root of the drive and show it in the prompt (see: http://stackoverflow.com/questions/157923/customizing-powershell-prompt-equivalent-to-cmds-mpg)

+4  A: 

Use the .NET framework:

PS H:\> $x = new-object system.io.driveinfo("h:\")
PS H:\> $x.drivetype
Network
Jeff Stong
Good tip!And then how do I get the Rootdirectory=Unfortunately RootDirectory points to H:\ again...
JJarava
@jjarava -- I belatedly realized that although the DriveInfo class will tell you the drive type it won't return the network path. Perhaps one of the other answers can provide that.
Jeff Stong
+1  A: 

Try WMI:

Get-WMI -query "Select ProviderName From Win32_LogicalDisk Where DeviceID='H:'"
EBGreen
+1  A: 

An alternative way to use WMI:

get-wmiobject Win32_LogicalDisk | ? {$_.deviceid -eq "s:"} | % {$_.providername}

Get all network drives with:

get-wmiobject Win32_LogicalDisk | ? {$_.drivetype -eq 4} | % {$_.providername}

Grant Wagner
+1  A: 

The most reliable way is to use WMI

get-wmiobject win32_volume | ? { $_.DriveType -eq 4 } | % { get-psdrive

$_.DriveLetter[0] }

The DriveType is an enum wit hthe following values

0 - Unknown 1 - No Root Directory 2 - Removable Disk 3 - Local Disk 4 - Network Drive 5 - Compact Disk 6 - RAM Disk

Here's a link to a blog post I did on the subject

JaredPar
The only "gotcha" with this approach (that seems much cleaner) is that I'm running WINXP, so the win32_volume class is not available!Thanks for the tip anyhow.
JJarava
+1  A: 

A slightly more compact variation on the accepted answer:

[System.IO.DriveInfo]("C")
Goyuix
+1  A: 

Take this a step further:

(System.IO.DriveInfo).Drivetype

Note this only works for the the local system. Use WMI for remote computers.

Jeffery Hicks