我们的组织在所有新计算机加入域之前都对其进行了重命名,而我正尝试创建一个脚本来显示下一个可用号码。
因此,我们的命名约定如下
示例:
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
任何帮助将不胜感激。
答案 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+)$" }