Поиск в реестре и создание 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]
Другие вопросы по тегам