Powershell 按顺序显示下一个可用号码

Powershell 按顺序显示下一个可用号码,powershell,scripting,Powershell,Scripting,我们的组织在所有新计算机加入我们的域之前重命名它们,我正在尝试创建一个脚本来显示下一个可用的数字 因此,我们的命名约定如下 例如: GBYOR-DT1 GB - YOR - DT - 1 [Country] [City] [Desktop] [Number] 然而,我的前任认为这些数字没有逻辑顺序,这在我的手表上是不会发生的。(有人说是强迫症吗?) 目前我在跑步 > Get-ADComputer -Filter * |

我们的组织在所有新计算机加入我们的域之前重命名它们,我正在尝试创建一个脚本来显示下一个可用的数字

因此,我们的命名约定如下

例如:

GBYOR-DT1

   GB      -   YOR     -   DT     -     1
[Country]     [City]    [Desktop]    [Number]
然而,我的前任认为这些数字没有逻辑顺序,这在我的手表上是不会发生的。(有人说是强迫症吗?)

目前我在跑步

> Get-ADComputer -Filter * | where{$_.Name -Like "GBYOR-DT*" | FL Name | Export-CSV -Path "X Location"
然后,我进入Excel,将单元格拆分并按数字排序

我想创建一个脚本,只显示下一个可用的数字

例如,目前我们有X台机器,一台是
GBYOR-DT4
,另一台是
GBYOR-DT245
,但没有
GBYOR-DT15

我想编写这个脚本,这样当我运行它时,它将查看在我们的域上注册的所有计算机,然后显示下一个

> GBYOR-DT1 
> GBYOR-DT2 
> GBYOR-DT3 
> GBYOR-DT4 
> GBYOR-DT6

> 
> ...GBYOR-DT5 does not exist so this is the next number to use for renaming.

如果有任何帮助,我们将不胜感激。

为了让它更具通用性,我将此脚本组合在一起,
这与PetSerAls的评论和我的建议有些不同

对于测试,我输入名称,并注释掉两个实际命令

## Q:\Test\2018\07\26\SO_51543166.ps1

$Prefix = Read-Host -Prompt "Enter the computer name prefix to search the first free number for"
$Prefix -match '^(.*?)\d*$' | Out-Null # strip possibly trailing numbers
$Prefix = $Matches[1]

$Number = 0 # initialize last Number to zero
'GBYOR-DT1', 'GBYOR-DT4', 'GBYOR-DT6', 'GBYOR-DT10', 'GBYOR-DT2', 'GBYOR-DT3'|
Where-Object {$_ -match "^$Prefix(\d+)$" }|
#Get-ADComputer -Filter * |
#Where-Object {$_.Name -match "^$Prefix(\d+)$" }|
   Select-Object @{n='UsedNumber';e={[int]$Matches[1]}} | Sort-Object UsedNumber |
      ForEach-Object {
         While ($Number +1 -lt $_.UsedNumber){"Free: {0}{1}" -f $Prefix,++$Number}
         $Number = $_.UsedNumber
      }
# if there was no gap get the next one.
"Free: {0}{1}" -f $Prefix,++$Number
样本运行:

> Q:\Test\2018\07\26\SO_51543166.ps1
Enter the computer name prefix to search the first free number for: GBYOR-DT
Free: GBYOR-DT5
Free: GBYOR-DT7
Free: GBYOR-DT8
Free: GBYOR-DT9
Free: GBYOR-DT11
要进行寿命测试,请删除或注释以下两行:

'GBYOR-DT1', 'GBYOR-DT4', 'GBYOR-DT6', 'GBYOR-DT10', 'GBYOR-DT2', 'GBYOR-DT3'|
Where-Object {$_ -match "^$Prefix(\d+)$" }|
并取消注释这些:

Get-ADComputer -Filter * |
Where-Object {$_.Name -match "^$Prefix(\d+)$" }
其中15是比最大值高的数字,假设您知道或可以猜到

正则表达式会替换每个计算机名称中任何数字之前的所有文本


解决方案取自:

数字是否应在每个前缀或全局范围内继续?无需切换到excel,使用不同长度的数字进行排序,并迭代结果以检查与前一个前缀的差距。@PetSerAl-如果您有时间,请将您的评论作为答案发布,并进行解释?如果您选择发布答案,将进行投票。您的解决方案非常好,而且IMHO这种技术通常是脚本语言的最佳选择。:)可能重复的
$ComputerNames = 'GBYOR-DT1', 'GBYOR-DT4', 'GBYOR-DT6', 
                 'GBYOR-DT10', 'GBYOR-DT2', 'GBYOR-DT3'

Compare-Object (1..15) ($ComputerNames -replace '.*?(?=\d+$)' -as [int[]]) -PassThru