将共享映射到powershell中未分配的驱动器号

时间:2012-01-10 06:55:33

标签: powershell powershell-v2.0

我使用PowerShell映射我的网络驱动器,如下所示。

$net = new-object -ComObject WScript.Network
$net.MapNetworkDrive("r:", "$Folder","FALSE","Domain\UserName", "Password")

但是我在这里发送驱动器号为r:。如果已使用r:驱动器,则会失败。

有没有办法将驱动器映射到未分配的驱动器号。 (例如,如果R:已经分配但S:不是,那么它应该自动映射到S:驱动器)

2 个答案:

答案 0 :(得分:5)

首先,您需要获取下一个可用的驱动器号。以下是Archive of PowerShell.com的示例:

function Get-NextFreeDrive {
  68..90 | ForEach-Object { "$([char]$_):" } | 
  Where-Object { 'h:', 'k:', 'z:' -notcontains $_  } | 
  Where-Object { 
    (new-object System.IO.DriveInfo $_).DriveType -eq 'noRootdirectory' 
  }
}

来自PowerShell.com:

  

首先枚举字母D:到Z:的ASCII代码。该   然后,管道将这些ASCII代码转换为驱动器号。下一个,   查看管道如何使用驱动器的排除列表   不想用于映射(可选)。在此示例中,驱动器号   h:,k:和z:从未使用过。最后,管道使用.NET   DriveInfo对象检查驱动器是否正在使用。

$net = new-object -ComObject WScript.Network
$net.MapNetworkDrive((Get-NextFreeDrive)[0], "$Folder","FALSE","Domain\UserName", "Password")

答案 1 :(得分:1)

我喜欢这种方式,原因如下:

它不需要WMI,只需要常规的PowerShell cmdlet 它非常清晰易读 它可以轻松地排除特定的驱动器 它可以让您轻松地按照您想要的任何顺序订购驱动器 它找到第一个未使用的驱动器并映射它,然后它就完成了。

$share="\\Server\Share"
$drvlist=(Get-PSDrive -PSProvider filesystem).Name
Foreach ($drvletter in "DEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray()) {
    If ($drvlist -notcontains $drvletter) {
        $drv=New-PSDrive -PSProvider filesystem -Name $drvletter -Root $share
        break
    }
}