提问人:Darren 提问时间:4/30/2022 最后编辑:Santiago SquarzonDarren 更新时间:5/5/2022 访问量:91
如何从设备名称列表中获取最大值
How to get the highest value from list of Device Names
问:
通过读取活动目录生成 Windows 工作站计算机名称列表,我需要找到最大的数字,以便我可以为新设备分配下一个可用数字 - 我没有成功做到这一点 - 怎么做?从名称列表中可以看出,我在理想情况下也想用新设备填充的序列中缺少数字......
我用于从 AD 获取列表的代码如下。
((Get-ADComputer -Filter {operatingsystem -notlike "*server*" -and Name -like $NamingConvention -and enabled -eq "true"} -Credential $credential -server $ADServerIP).Name)
设备名称列表
PC01型 PC28型 个人电脑29 PC30型 PC31型 PC32型 PC33型 PC34型 PC35型 PC36型 PC37型 PC38型 PC40型 PC41型 PC42型 PC43型 个人电脑44 PC45型 PC46型 PC47型 个人电脑27 PC48型 个人电脑26 PC24型 PC179型 PC18型 PC180型 PC181型 PC182型 PC183型 PC184型 PC185型 PC186型 PC187型 PC188型 PC189型 个人电脑19 PC190型 PC191型 PC192型 PC21型 个人电脑22 PC23型 个人电脑25 PC178型 个人电脑49 PC51型 PC77型 PC78型 PC79型 PC80型 PC81型 PC83型 PC84型 PC85型 PC87型 PC88型 PC89型 PC90型 PC91型 PC92型 PC93型 PC94型 PC95型 PC96型 PC97型 PC76型 PC50型 PC75型 PC72型 PC52型 PC53型 PC54型 PC55型 PC56型 PC57型 PC59型 PC60型 PC61型 PC62型 PC63型 PC64型 PC65型 个人电脑66 PC67型 PC68型 PC69型 PC70型 PC71型 PC73型 PC98型 PC177型 PC175型 个人电脑115 PC116型 PC117型 PC118型 PC119型 个人电脑12 PC120型 PC121型 PC122型 个人电脑123 PC124型 PC125型 PC126型 PC127型 PC128型 个人电脑129 PC13型 PC130型 PC131型 PC114型 PC132型 PC113型 PC111型 RCr2型 PC03型 PC04型 PC06型 PC08型 PC09型 PC10型 PC100型 PC101型 PC102型 PC103型 PC104型 PC105型 PC106型 PC107型 PC108型 PC109型 个人电脑11 PC110型 PC112型 PC176型 PC133型 PC135型 PC158型 PC159型 PC16型 PC160型 PC161型 PC162型 PC163型 PC164型 PC165型 PC166型 PC167型 PC168型 PC169型 个人电脑17 PC170型 PC171型 PC172型 PC173型 PC174型 PC157型 PC134型 PC156型 PC154型 PC136型 个人电脑137 PC138型 PC139型 PC14型 PC140型 PC141型 PC142型 PC143型 PC144型 PC145型 PC146型 PC147型 PC148型 PC149型 PC150型 PC151型 PC152型 PC153型 PC155型 PC99型
答:
假设您的列表与它看起来完全一样,那么这似乎是一种方法:
$List = 'PC01 PC28 PC29 PC30 PC31 PC32 PC33 PC34 PC35 PC36 PC37 PC38 PC40 PC41 PC42 PC43 PC44 PC45 PC46 PC47 PC27 PC48 PC26 PC24 PC179 PC18 PC180 PC181 PC182 PC183 PC184 PC185 PC186 PC187 PC188 PC189 PC19 PC190 PC191 PC192 PC21 PC22 PC23 PC25 PC178 PC49 PC51 PC77 PC78 PC79 PC80 PC81 PC83 PC84 PC85 PC87 PC88 PC89 PC90 PC91 PC92 PC93 PC94 PC95 PC96 PC97 PC76 PC50 PC75 PC72 PC52 PC53 PC54 PC55 PC56 PC57 PC59 PC60 PC61 PC62 PC63 PC64 PC65 PC66 PC67 PC68 PC69 PC70 PC71 PC73 PC98 PC177 PC175 PC115 PC116 PC117 PC118 PC119 PC12 PC120 PC121 PC122 PC123 PC124 PC125 PC126 PC127 PC128 PC129 PC13 PC130 PC131 PC114 PC132 PC113 PC111 PC02 PC03 PC04 PC06 PC08 PC09 PC10 PC100 PC101 PC102 PC103 PC104 PC105 PC106 PC107 PC108 PC109 PC11 PC110 PC112 PC176 PC133 PC135 PC158 PC159 PC16 PC160 PC161 PC162 PC163 PC164 PC165 PC166 PC167 PC168 PC169 PC17 PC170 PC171 PC172 PC173 PC174 PC157 PC134 PC156 PC154 PC136 PC137 PC138 PC139 PC14 PC140 PC141 PC142 PC143 PC144 PC145 PC146 PC147 PC148 PC149 PC150 PC151 PC152 PC153 PC155 PC99'
$NextNumber = ($List -split "\s" | ForEach-Object { if ($_ -match 'PC(?<Number>\d+)') { $Matches.Number } } | Measure-Object -Maximum).Maximum + 1
$NextNumber
"PC$NextNumber"
根据其数值对电脑名称进行排序,然后选择最后一个:
$lastPC = (Get-ADComputer -Filter {operatingsystem -notlike "*server*" -and Name -like $NamingConvention -and enabled -eq "true"} -Credential $credential -server $ADServerIP).Name |
Sort-Object { [int]($_ -replace '\D+')} | Select-Object -Last 1
这是一个解决方案,它将为您提供最大数字、缺失的数字和下一个要使用的数字。下一个要使用的数字将是第一个缺失的数字,或者如果没有缺失的数字,那么它将是最大的数字 + 1($dataMax)
($dataMissing)
($dataNext)
# load the computers list
$data = ((Get-ADComputer -Filter {operatingsystem -notlike "*server*" -and Name -like $NamingConvention -and enabled -eq "true"} -Credential $credential -server $ADServerIP).Name)
# create an array by splitting the data text using the "space" character as a delimiter
$data = $data.Split(" ")
# remove all the alpha characters ("PC"), leaving only the number values so it can be sorted easier
$dataCleaned = $data -replace "[^0-9]" , '' | sort { [int]$_ }
# after sorting the data, [-1] represents the last element in the array which will be the highest number
[int]$dataMax = $dataCleaned[-1]
# create a number range that represents all the numbers from 1 to the highest number
$range = 1..$dataMax | foreach-object { '{0:d2}' -f $_ }
# compare the created range against the numbers actually in the computer array to find the missing numbers
$dataMissing = @(compare $range $dataCleaned -PassThru)
# if there's a missing value, [0] represents the first element in the array of missing numbers
if ($dataMissing)
{
$dataNext = $dataMissing[0]
}
# if there's no missing values, the next value is the max value + 1
else
{
$dataMissing = "none"
$dataNext = $dataMax + 1
}
Write-Host "The highest number is:"('{0:d2}' -f $dataMax)
Write-Host "The missing numbers are: $dataMissing"
Write-Host "The next number to use is:" ('{0:d2}' -f $dataNext)
评论
{0:d2}' -f
$dataMissing
$dataMissing[0]
$dataMissing[1]
评论