获得免费的驱动器号

Nic*_*ick 11 powershell

Get-NextFreeDrive这个答案中看到了这个功能,我想知道是否有更有效的方法来做到这一点.即使已经找到一个免费的驱动器号,看起来链接的答案中的函数仍然会遍历所有字母.

rav*_*nth 22

在PowerShell杂志上,我们举办了一场脑筋急转弯比赛,以找出问题的最短答案.检查一下:

http://www.powershellmagazine.com/2012/01/12/find-an-unused-drive-letter/

有几个答案,但这是我最喜欢的答案:

ls function:[d-z]: -n | ?{ !(test-path $_) } | random
Run Code Online (Sandbox Code Playgroud)

  • 这个答案有误导性,它可能会返回没有媒体的现有驱动器(如CD-ROM).这是一个更好的版本:http://powershell.com/cs/media/p/202.aspx (5认同)
  • @Nick - 可以通过用`select -First 1`替换`random`来解决这个问题 (3认同)
  • `function:[dz]:`工作怎么样?是否记录了这种语法? (3认同)

CB.*_*CB. 5

我的两分钱:

get-wmiobject win32_logicaldisk | select -expand DeviceID -Last 1 | 
% { [char]([int][char]$_[0]  + 1) + $_[1] }
Run Code Online (Sandbox Code Playgroud)

有效范围[CHAR]68..90,如果[char]$_[0] -gt 90避免意外结果,则添加检查。如果某个单元是映射的网络驱动器,它总是返回主要的连续驱动器,例如:

c: system drive
d: cd/dvd
r: network mapped drive
Run Code Online (Sandbox Code Playgroud)

命令返回s:而不是e:作为 [string]

这给出了第一个免费驱动器号(有点难看......有人可以做得更好 IMO):

$l = get-wmiobject win32_logicaldisk | select -expand DeviceID  | % { $_[0] }
$s = [int][char]$l[0]
foreach ( $let in $l )
{
    if ([int][char]$let -ne $s)
    {
        $ret = [char]$s +":"
        break
    }

    $s+=1    
}
$ret 
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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

    $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
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)