我在this answer中看到了Get-NextFreeDrive
函數,我想知道是否有更高效的方法來執行此操作。看起來鏈接的答案中的功能會繼續檢查所有字母,即使它已經找到了空閒的驅動器號。獲取免費驅動器號
獲取免費驅動器號
回答
在PowerShell雜誌上,我們舉辦了一場智力競賽比賽,以找出最短的問題答案。檢查:
http://www.powershellmagazine.com/2012/01/12/find-an-unused-drive-letter/
有幾個答案,但這裏是我的最愛之一:
ls function:[d-z]: -n | ?{ !(test-path $_) } | random
我的兩分錢:
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
這是我想出來的。我需要從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
- 最後輸出一個字母。
$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:驅動器,以防萬一可能會使事情複雜化。
我喜歡這種方式,有以下原因:
- 它並不需要WMI,只需定期PowerShell命令
- 這是非常清楚的,易於閱讀
- 它很容易讓你排除特定履歷
- 它可以輕鬆地讓您按任意順序訂購履行機構
它找到第一個未使用的驅動器號並映射它,然後它是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 } }
我發現測試的路徑計算我的空CD驅動器爲假,這裏是另一種選擇,將直到它找到一個不存在的文件系統中alphabeth每一個字母比較,然後將該驅動器作爲輸出返回。
$DriveLetter = [int][char]'C'
WHILE((Get-PSDrive -PSProvider filesystem).Name -contains [char]$DriveLetter){$DriveLetter++}
Write-Host "$([char]$Driveletter):"
我不得不寫一個適用於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'
另一種方式......
$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) + ":"
只是要添加一個用於遠程驅動器號 $計算機將在INP工作UT和$驅動器號將包含在遠程計算機上的一個可用驅動器
67..90 | foreach {if(((GWmi win32_logicaldisk -computer $computer -Property DeviceID).deviceID).Substring(0,1) -notcontains [char]$_){$driveLetter = [char]$_; break}}
也許能夠縮短這一點,但在那個長度清晰的看見什麼在
我發現我自己的成本去了目前接受的答案(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 1
到Select-Object -last 1
- 1. 從驅動器盤符獲取驅動器型號
- 2. 獲取硬盤的驅動器號
- 3. 在VB.NET中獲取CD驅動器號
- 4. 如何獲取pendrive的驅動器號
- 5. 顯示建築物及其號碼免費驅動
- 6. 如何獲得Linux設備驅動程序的免費次要號碼?
- 7. 如何獲取驅動器標籤和驅動器序列號QB64
- 8. 在Java中獲取驅動器名稱(而不是驅動器號)
- 9. 獲取邏輯驅動器
- 10. 如何從Windows 7的驅動器號中獲取可移動設備的物理驅動器號?
- 11. 免費的免費動態內存()
- 12. 獲取包括共享RDP驅動器的驅動器列表
- 13. 無法獲取點免費符號在Haskell
- 14. 在PowerShell中按名稱獲取網絡驅動器號
- 15. 從驅動器號獲取Windows設備句柄
- 16. 從模擬後的映射驅動器號獲取UNC路徑
- 17. 通過網絡獲取安裝的iso的驅動器號
- 18. 在C#中使用SQL獲取數據庫的驅動器號
- 19. VB.NET獲取下一個可用的驅動器號
- 20. 如何獲取系統驅動器卷序列號
- 21. 從驅動器號獲取特定設備類型
- 22. 獲取網絡路徑不從FolderBrowserDialog驅動器號
- 23. 如何獲取驅動器號在Powershell 2.0中的列表
- 24. 從C#中的設備句柄獲取驅動器號
- 25. WINAPI C++獲取當前物理驅動器號
- 26. 如何獲取USB設備的驅動器號?
- 27. 使用Powershell獲取硬盤驅動器序列號
- 28. 符號PocketBrowser替代免費
- 29. 雙免費電話號碼
- 30. 免費獲取地理/工業數據?
這只是得到一個隨機的可用驅動器號,而不是第一個可用的。 – Nick
@Nick - 即可以通過用替換'random'固定'選擇 - 第一1' – Rynant
由於@Rynant。是的,我只是展示了我最喜歡的方式來做到這一點。 – ravikanth