Поиск в реестре и создание New-Item
Я хочу создать New-Item
в реестре с предварительной проверкой того, что уже существует.
Этот код
$items = get-item "HKCU:\SOFTWARE\Microsoft\Office\16.0\Excel\Options"
$items.Property -match "OPEN"
возвращает следующее
OPEN
OPEN1
OPEN2
OPEN3
OPEN4
Теперь я знаю, что мне нужно создать New-Item
с именем OPEN5
, но как мне рассчитывать через это? Может быть с While-Loop
?
1 ответ
Наиболее надежный подход заключается в извлечении встроенных чисел, их числовой сортировке и добавлении 1
до самого высокого показателя на сегодняшний день:
$nextNdx = 1 +
([int[]] ($items.Property -match '^OPEN' -replace '\D') | Sort-Object)[-1]
$items.Property -match '^OPEN' -replace '\D'
возвращает все имена свойств, которые начинаются сOPEN
и удаляет из них все нецифровые символы (-replace '\D'
).[int[]]
преобразует результирующие "числовые строки" в фактические числа ([int]
); обратите внимание, что кастинг''
или же$null
в[int]
в PowerShell дает0
,Sort-Object
сортирует эти числа, и[-1]
захватывает последнее число из полученного массива, то есть наибольшее число.
Вышеуказанное удобно, но не быстро из-за использования трубопровода и Sort-Object
Командлет.
Если вы хотите избежать конвейера по соображениям производительности:
$indices = [int[]] ($items.Property -match '^OPEN' -replace '\D')
[Array]::Sort($indices) # sort in place
$nextNdx = 1 + $indices[-1]