mirror of
https://github.com/rbalsleyMSFT/FFU.git
synced 2026-06-14 02:09:35 -06:00
Improves USB drive selection for same-model drives
Preserves multiple selected drives that share the same model by storing an array of UniqueIds per model. Updates drive discovery and UI restore logic to accept either a single UniqueId or a list, preventing missed selections and skipping duplicate additions.
This commit is contained in:
@@ -195,9 +195,11 @@ Path to a JSON file containing a list of user-defined applications to install. D
|
|||||||
.PARAMETER USBDriveList
|
.PARAMETER USBDriveList
|
||||||
A hashtable containing USB drives from win32_diskdrive where:
|
A hashtable containing USB drives from win32_diskdrive where:
|
||||||
- Key: USB drive model name (partial match supported)
|
- Key: USB drive model name (partial match supported)
|
||||||
- Value: USB drive serial number (trailing partial match supported due to some serial numbers ending with blank spaces)
|
- Value: USB drive UniqueId string, or an array of UniqueIds (to support selecting multiple drives with the same model)
|
||||||
|
|
||||||
Example: @{ "SanDisk Ultra" = "1234567890"; "Kingston DataTraveler" = "0987654321" }
|
Examples:
|
||||||
|
@{ "SanDisk Ultra" = "1234567890" }
|
||||||
|
@{ "SanDisk Ultra" = @("1234567890", "ABCDEFG"); "Kingston DataTraveler" = "0987654321" }
|
||||||
|
|
||||||
.PARAMETER MaxUSBDrives
|
.PARAMETER MaxUSBDrives
|
||||||
Maximum number of USB drives to build in parallel. Default is 5. Set to 0 to process all discovered drives (or all selected drives when USBDriveList or selection is used). Actual throttle will never exceed the number of drives discovered.
|
Maximum number of USB drives to build in parallel. Default is 5. Set to 0 to process all discovered drives (or all selected drives when USBDriveList or selection is used). Actual throttle will never exceed the number of drives discovered.
|
||||||
@@ -3961,12 +3963,23 @@ Function Get-USBDrive {
|
|||||||
}
|
}
|
||||||
elseif ($USBDriveList) {
|
elseif ($USBDriveList) {
|
||||||
# Log the count of specified USB drives
|
# Log the count of specified USB drives
|
||||||
$USBDriveListCount = $USBDriveList.Count
|
# USBDriveList values can be a single UniqueId string, or an array of UniqueIds (multiple same-model drives)
|
||||||
|
$USBDriveListCount = 0
|
||||||
|
foreach ($model in $USBDriveList.Keys) {
|
||||||
|
$USBDriveListCount += @($USBDriveList[$model]).Count
|
||||||
|
}
|
||||||
WriteLog "Looking for $USBDriveListCount USB drives from USB Drive List"
|
WriteLog "Looking for $USBDriveListCount USB drives from USB Drive List"
|
||||||
|
|
||||||
# Get only the specified USB drives based on model and UniqueId
|
# Get only the specified USB drives based on model and UniqueId
|
||||||
$USBDrives = @()
|
$USBDrives = @()
|
||||||
foreach ($model in $USBDriveList.Keys) {
|
foreach ($model in $USBDriveList.Keys) {
|
||||||
$configUniqueId = $USBDriveList[$model]
|
$configUniqueIds = @($USBDriveList[$model])
|
||||||
|
|
||||||
|
foreach ($configUniqueId in $configUniqueIds) {
|
||||||
|
if ([string]::IsNullOrWhiteSpace([string]$configUniqueId)) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
WriteLog "Looking for USB drive model $model with UniqueId $configUniqueId"
|
WriteLog "Looking for USB drive model $model with UniqueId $configUniqueId"
|
||||||
# First get candidate drives by model and media type
|
# First get candidate drives by model and media type
|
||||||
$candidateDrives = Get-CimInstance -ClassName Win32_DiskDrive -Filter "Model LIKE '%$model%' AND (MediaType='Removable Media' OR MediaType='External hard disk media')"
|
$candidateDrives = Get-CimInstance -ClassName Win32_DiskDrive -Filter "Model LIKE '%$model%' AND (MediaType='Removable Media' OR MediaType='External hard disk media')"
|
||||||
@@ -3990,13 +4003,19 @@ Function Get-USBDrive {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($foundDrive) {
|
if ($foundDrive) {
|
||||||
|
if ($USBDrives.Index -notcontains $foundDrive.Index) {
|
||||||
WriteLog "Found USB drive model $($foundDrive.Model) with UniqueId $configUniqueId"
|
WriteLog "Found USB drive model $($foundDrive.Model) with UniqueId $configUniqueId"
|
||||||
$USBDrives += $foundDrive
|
$USBDrives += $foundDrive
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
WriteLog "USB drive model $($foundDrive.Model) with UniqueId $configUniqueId was already added. Skipping duplicate."
|
||||||
|
}
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
WriteLog "USB drive model $model with UniqueId $configUniqueId not found"
|
WriteLog "USB drive model $model with UniqueId $configUniqueId not found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
$USBDrivesCount = $USBDrives.Count
|
$USBDrivesCount = $USBDrives.Count
|
||||||
WriteLog "Found $USBDrivesCount of $USBDriveListCount USB drives from USB Drive List"
|
WriteLog "Found $USBDrivesCount of $USBDriveListCount USB drives from USB Drive List"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -115,8 +115,27 @@ function Get-UIConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Save selected USB drives using UniqueId for reliable identification
|
# Save selected USB drives using UniqueId for reliable identification
|
||||||
|
# Multiple physical drives can share the same Model, so store an array of UniqueIds per Model.
|
||||||
$State.Controls.lstUSBDrives.Items | Where-Object { $_.IsSelected } | ForEach-Object {
|
$State.Controls.lstUSBDrives.Items | Where-Object { $_.IsSelected } | ForEach-Object {
|
||||||
$config.USBDriveList[$_.Model] = $_.UniqueId
|
$modelName = $_.Model
|
||||||
|
$uniqueId = $_.UniqueId
|
||||||
|
|
||||||
|
if ([string]::IsNullOrWhiteSpace($modelName) -or [string]::IsNullOrWhiteSpace($uniqueId)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
# Ensure the hashtable value is always an array so multiple same-model drives are preserved
|
||||||
|
$existingUniqueIds = $config.USBDriveList[$modelName]
|
||||||
|
if ($null -eq $existingUniqueIds) {
|
||||||
|
$config.USBDriveList[$modelName] = @($uniqueId)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
$existingUniqueIds = @($existingUniqueIds)
|
||||||
|
if (-not ($existingUniqueIds -contains $uniqueId)) {
|
||||||
|
$existingUniqueIds += $uniqueId
|
||||||
|
}
|
||||||
|
$config.USBDriveList[$modelName] = $existingUniqueIds
|
||||||
}
|
}
|
||||||
|
|
||||||
# Additional FFU file selections
|
# Additional FFU file selections
|
||||||
@@ -671,7 +690,19 @@ function Update-UIFromConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Match USB drives by UniqueId instead of SerialNumber
|
# Match USB drives by UniqueId instead of SerialNumber
|
||||||
if ($propertyExists -and ($propertyValue -eq $item.UniqueId)) {
|
# USBDriveList values can be a single UniqueId (string) or an array of UniqueIds (multiple same-model drives)
|
||||||
|
$isMatch = $false
|
||||||
|
if ($propertyExists) {
|
||||||
|
if ($propertyValue -is [string]) {
|
||||||
|
$isMatch = ($propertyValue -eq $item.UniqueId)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$propertyValueArray = @($propertyValue)
|
||||||
|
$isMatch = ($propertyValueArray -contains $item.UniqueId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($isMatch) {
|
||||||
WriteLog "LoadConfig: Selecting USB Drive Model '$($item.Model)' with UniqueId '$($item.UniqueId)'."
|
WriteLog "LoadConfig: Selecting USB Drive Model '$($item.Model)' with UniqueId '$($item.UniqueId)'."
|
||||||
$item.IsSelected = $true
|
$item.IsSelected = $true
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user