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

时间:2018-07-26 16:03:29

标签: powershell scripting

我们的组织在所有新计算机加入域之前都对其进行了重命名,而我正尝试创建一个脚本来显示下一个可用号码。

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

示例:

select top (1) with ties t.letter1, t2.num2, t.date1
from table1 t inner join
     table2 t2
     on t2.letter1 = t.letter1 AND t2.num1 = t.num1
order by row_number() over (partition by t2.letter1, t2.num2 order by t.date1 desc);

但是,我的前任认为这些编号没有逻辑顺序,而这在我的手表上根本没有发生。 (有人说强迫症吗?)

当前,我运行

GBYOR-DT1

   GB      -   YOR     -   DT     -     1
[Country]     [City]    [Desktop]    [Number]

然后我进入Excel,按数字拆分单元格和排序。

我想要创建一个仅显示下一个可用号码的脚本。

例如,按照目前的情况,我们有X台计算机,一台是> Get-ADComputer -Filter * | where{$_.Name -Like "GBYOR-DT*" | FL Name | Export-CSV -Path "X Location" ,另一台是GBYOR-DT4,但是没有GBYOR-DT245

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

GBYOR-DT15

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

$ComputerNames = 'GBYOR-DT1', 'GBYOR-DT4', 'GBYOR-DT6', 
                 'GBYOR-DT10', 'GBYOR-DT2', 'GBYOR-DT3'

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

假设您知道或可以猜到15,则该数字比最大值高15。

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

解决方案取自:Find free number in a range

答案 1 :(得分:0)

为了使它更通用,我将这个脚本放在一起,
这与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+)$" }