2012-09-19 53 views
9

我在this answer中看到了Get-NextFreeDrive函數,我想知道是否有更高效的方法來執行此操作。看起來鏈接的答案中的功能會繼續檢查所有字母,即使它已經找到了空閒的驅動器號。獲取免費驅動器號

回答

17

在PowerShell雜誌上,我們舉辦了一場智力競賽比賽,以找出最短的問題答案。檢查:

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

有幾個答案,但這裏是我的最愛之一:

ls function:[d-z]: -n | ?{ !(test-path $_) } | random 
+0

這只是得到一個隨機的可用驅動器號,而不是第一個可用的。 – Nick

+2

@Nick - 即可以通過用替換'random'固定'選擇 - 第一1' – Rynant

+0

由於@Rynant。是的,我只是展示了我最喜歡的方式來做到這一點。 – ravikanth

4

我的兩分錢:

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

的有效[CHAR]範圍是68..90,加入檢查[char]$_[0] -gt 90是否會避免意外的結果。 在一些情況下,單元是映射的網絡驅動器,它總是返回主要連續,前:

c: system drive 
d: cd/dvd 
r: network mapped drive 

命令返回s:和不e:爲[字符串]

這得到第一自由驅動器號(有點難看..有人可以做得更好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 
1

這是我想出來的。我需要從A最後一個可用驅動器字母Z.

$AllLetters = 65..90 | ForEach-Object {[char]$_ + ":"} 
$UsedLetters = get-wmiobject win32_logicaldisk | select -expand deviceid 
$FreeLetters = $AllLetters | Where-Object {$UsedLetters -notcontains $_} 
$FreeLetters | select-object -last 1 
  • 這得到的字母數組a到z
  • 然後得到的字母組成的數組已在使用來自WMI
  • 下一頁使用比較運算符生成一組未使用的字母-notcontains
  • 最後輸出一個字母。
1
$taken = Get-WmiObject Win32_LogicalDisk | Select -expand DeviceID 
$letter = 65..90 | ForEach-Object{ [char]$_ + ":" } 
(Compare-Object -ReferenceObject $letter -DifferenceObject $taken)[1].InputObject 

只是爲了好玩刮鬍子一個額外的代碼行(笑)。如果你想變得笨拙,你可以跳過實例化變量,直接將它們直接輸入到-Ref和-Diff中,但可能應該這樣做。 :)

選擇[1]以避免獲得A:驅動器,以防萬一可能會使事情複雜化。

3

我喜歡這種方式,有以下原因:

  1. 它並不需要WMI,只需定期PowerShell命令
  2. 這是非常清楚的,易於閱讀
  3. 它很容易讓你排除特定履歷
  4. 它可以輕鬆地讓您按任意順序訂購履行機構
  5. 它找到第一個未使用的驅動器號並映射它,然後它是fin ished。

    $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 
        } 
    } 
    
0

我發現測試的路徑計算我的空CD驅動器爲假,這裏是另一種選擇,將直到它找到一個不存在的文件系統中alphabeth每一個字母比較,然後將該驅動器作爲輸出返回。

$DriveLetter = [int][char]'C' 
WHILE((Get-PSDrive -PSProvider filesystem).Name -contains [char]$DriveLetter){$DriveLetter++} 
Write-Host "$([char]$Driveletter):" 
1

我不得不寫一個適用於Powershell V2.0的函數。 下面的函數將返回下一個字符,它也可以得到一個排除信作爲參數:

Function AvailableDriveLetter() 
{ 
param ([char]$ExcludedLetter) 
$Letter = [int][char]'C' 
$i = @() 
#getting all the used Drive letters reported by the Operating System 
$(Get-PSDrive -PSProvider filesystem) | %{$i += $_.name} 
#Adding the excluded letter 
$i+=$ExcludedLetter 
while($i -contains $([char]$Letter)){$Letter++} 
Return $([char]$Letter) 
} 

比方說,你的OS報表駕車字母C:,E:,F:和G:爲正在使用。

運行:$首先= AvailableDriveLetter,將會導致含有 'd'

運行$第一:$秒= AvailableDriveLetter -ExcludedLetter $首先,將會導致含有$二段 'H'

1

另一種方式......

$DriveList = Get-PSDrive -PSProvider filesystem | foreach({($_.Root).Replace(":\","")}) 
$AllDrives = [char[]]([int][char]'E'..[int][char]'Z') 
$NextDriveLetter = ($AllDrives | Where-Object { $DriveList -notcontains $_ } | Select-Object -First 1) + ":" 
0

只是要添加一個用於遠程驅動器號 $計算機將在INP工作UT和$驅動器號將包含在遠程計算機上的一個可用驅動器

67..90 | foreach {if(((GWmi win32_logicaldisk -computer $computer -Property DeviceID).deviceID).Substring(0,1) -notcontains [char]$_){$driveLetter = [char]$_; break}} 

也許能夠縮短這一點,但在那個長度清晰的看見什麼在

1

我發現我自己的成本去了目前接受的答案(ls函數:[dz]:-n | ?{!(test-path $ _)} |隨機)確實可以返回像CD驅動器的東西。

我做了這個一個從數組中排除任何本地驅動器:

"$([char[]]([char]'D'..[char]'Z')|Where-Object {((Get-WmiObject -Class Win32_LogicalDisk).DeviceID).replace(':','') -notcontains $_ }|Select-Object -first 1):" 

它將返回第一個可用的字母。如果你喜歡最後一個可用的信只是改變Select-Object -first 1Select-Object -last 1