Преобразование ваших строк в числа можно выполнить с помощью простого cast :
$dataset = "0001","0002","0004","0006","2","5"
$numbers = [int[]] $dataset
Чтобы отсортировать эти числа и устранить дубликаты:
$uniqueSortedNumbers = $numbers | Sort-Object -Unique
Найтипервый доступный номер в результирующем списке или, возможно, следующий более высокий номер:
# Find the first gap in the list of sorted numbers, if any.
$nextAvailableNumber =
Compare-Object -PassThru $uniqueSortedNumbers (1..($uniqueSortedNumbers[-1])) |
Select-Object -First 1
# If there was no gap, use the highest number + 1
if ($null -eq $nextAvailableNumber) {
$nextAvailableNumber = $uniqueSortedNumbers[-1] + 1
}
Что касается того, что вы пытались :
Compare-Object
списковобъекты, которые являются уникальными для либо коллекции.
При наличии дубликатов в $used
дубликаты также сообщаются как уникальные, так как $range
не имеет дубликатов.
При -PassThru
уникальные значения передаются без (очевидного) различия в отношении того, для какой коллекции входов они уникальны, так что в итоге вы получите комбинацию чисел, уникальных для любой коллекции, включающую оба числа, уникальные для $range
и дубликатов, которые объясняют ваш симптом.
За счет предварительного удаления дубликатов из $used
проблема устраняется, поскольку все уникальные значения гарантируютсяd только из $range
.