2

我想New-Item 在注册表中创建一个预先检查已经存在的内容。

这段代码

$items = get-item "HKCU:\SOFTWARE\Microsoft\Office\16.0\Excel\Options" 
$items.Property -match "OPEN"

返回以下

OPEN
OPEN1
OPEN2
OPEN3
OPEN4

现在我知道我需要创建一个New-Itemname OPEN5,但是我该如何计算呢?也许有一个While-Loop

4

1 回答 1

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]);请注意,在 PowerShell中强制转换''$null生成.[int]0

  • Sort-Object对这些数字进行排序,并[-1]从结果数组中获取最后一个数字,即最大的数字。


由于使用了管道和Sort-Objectcmdlet,上述方法很方便,但并不快速。

如果出于性能原因要避免使用管道:

$indices = [int[]] ($items.Property -match '^OPEN' -replace '\D')
[Array]::Sort($indices) # sort in place
$nextNdx = 1 + $indices[-1]
于 2018-11-13T15:46:42.037 回答