Powershell如何知道列表的元素是否连续编号



我想知道是否所有的PC都在列表中,如果一个不在列表中,脚本会说我,列表可以修改更多的PC。


$equipos= "equipo1","equipo2","equipo3","equipo5"
[char]$nequipos = 1
for($i=0;$i -lt $equipos.count;$i++){
[char]$num = $equipos[$i][6]
if($num -ne $nequipos){
write-host "equipo"$nequipos
}
[char]$nequipos= $i++
}

查找编号中的空白,并根据缺失的编号列出所有可用的名称:

# Extract all numbers contained in the names.
[int[]] $numbers =  "equipo1", "equipo2", "equipo3", "equipo5" -replace 'D'
# Find the highest number.
$highestNumber = [Linq.Enumerable]::Max($numbers)
# Find all unused numbers.
$unusedNumbers = Compare-Object $numbers (1..$highestNumber) -PassThru
# Report results.
if ($unusedNumbers) {
Write-Verbose -Verbose "The following names are available: "
$unusedNumbers.ForEach({ 'equipo' + $_ })
} else {
Write-Verbose -Verbose "No gaps in numbering found."
}

输出:

VERBOSE: The following names are available:
equipo4

注意:

  • -replace'D'从名称中删除所有非数字(D)字符,并将结果字符串强制转换为[int[]],以获得数字数组。

  • [Linq.Enumerable]::Max($numbers)找到其中的最大值。参见. net文档。

  • Compare-Object用于将提取的数字与从1到最高的(1..$highestNumber)的数字 (..)的(无gap)范围进行比较。默认情况下,报告输入集合之间不同的元素,并且由于-PassThru,从范围中缺少的那些提取的数字将直接输出。

  • $unusedNumbers.ForEach({ 'equipo' + $_ })使用.ForEach()数组方法构造范围内未使用的号码的名称列表。

假设名称是唯一的,您可以选择序列中最大的数字并减去列表的长度-这将得到间隔的数量:

$equipos = "equipo1","equipo2","equipo3","equipo5" |Sort-Object {$_ -replace '^D+' -as [int]} -Unique -Descending 
$highest = $equipos |Select -First 1
$number = $highest -replace '^D+' -as [int]
if($number -gt $equipos.Length){
"There are $($number - $equipos.Length) gap(s) in the list"
} 
else {
"The list is contiguous"
}

对于给定的样本值,它将输出:

There are 1 gap(s) in the list

最新更新