В посте про mountvol я упомянул, что для подключения диска нужна свободная буква. Не всегда она известна заранее. В скриптах эта типовая задача решается конвейером в одну строку:
1/ Создание списка букв
2/ Проверка существующих путей (занятых букв) перебором по списку
3/ Выбор свободной буквы
Второй и третий этапы почти всегда одинаковые:
<буквы> | Where-Object {!(Test-Path $_)} | Select-Object -First 1
Иногда вместо
Select-Object используют Get-Random, но это менее эффективно.
А вот на первом этапе бывают варианты. Часто используют оператор Range для диапазона букв. Тут, кстати, два этапа конвейера.
'j'..'z' | ForEach-Object { "${_}:" }
Мне также встречалось перечисление символов ASCII, где 65 - А, 90 - Z. Но оно менее естественное.
65..90 | ForEach-Object { [char]$_ + ":" }
🔥 А недавно мне попался, пожалуй, самый любопытный способ:
Get-ChildItem function:[j-z]: -Name
В этой команде:
🔹
function: - трюк для получения готового списка букв дисков. Здесь #PowerShell обращается к поставщику функций. Выполните Get-ChildItem -Path Function: и вы увидите не только загруженные из профиля функции, но и список букв дисков!
🔹
[j-z]: - регулярное выражение, которое выбирает из списка функций только буквы в заданном диапазоне.
🔹
-Name - параметр форсирует получение только строковых значений, нежели полного объекта
Полная команда для получения первой свободной буквы диска в заданном диапазоне. Для краткости я заменил названия командлетов на их псевдонимы.
dir function:[j-z]: -Name | where {!(Test-Path $_)} | select -First 1
Этот метод должен быть самый быстрый, хотя разница всё равно измеряется долями секунды - в скрипте это не существенно. Тут скорее играет роль, что вы помните или быстрее вводите. На мой взгляд, вариант с диапазоном букв посложнее набирать.
////
Наконец, мне в комментариях к посту про mountvol подписчик Алексей доставлял, что все свободные буквы могут быть заняты разнообразными дисками. Хотя к тому моменту я уже добавил ссылку на статью блога с решением именно этой задачи - подключением диска в папку NTFS.
Впрочем, это не сработает именно для раздела EFI! У
mountvol ключ /s предусматривает только подключение в букву диска, потому что у EFI файловая система FAT32! В такой ситуации надо действовать в зависимости от требуемых изменений. Например, для файловых операций можно обойтись без подключения раздела, но для команд bcdedit логичнее освободить букву на время✌