Get the next available unused AD ComputerName and OU location?

People,

I wonder if anyone can assist me in modifying the below PowerShell code that shows the OU where the Computer Object name can be used:

$patterns = 'PRD', 'DR', 'TEST'
ForEach( $prefix in $patterns) {
Get-ADComputer-Filter "Name -like '$($prefix)*'"|
ForEach-Object {[int]($_.Name-replace'(?:.*?)(\d+)\Z','$1')} |
Measure-Object-Maximum |
ForEach-Object {$prefix+ (++$_.Maximum).ToString('000')}
}
Because at the moment it is just showing the next available name, and I'd like the expected output to be:
OU: domain.com/Servers/Production
Next available computer name: PRDSVR003
OU: domain.com/Servers/Test
Next available computer name: TESTSVR027
OU: domain.com/Servers/DR Site
Next available computer name: DRSVR089
Without the error:
Cannot convert value "PRD23-OLD" to type "System.Int32". Error: "Input string was not in a correct format."
Cannot convert value "TEST72-DEV" to type "System.Int32". Error: "Input string was not in a correct format."
Any help would be greatly appreciated.

You cannot cast a type [int] when the value contains others than numbers.

# this will fail
[int]‘nineteen’

this not

[int]‘19’


Could you please format your code as code? It will make your life and ours easier. Thanks.

Hi Olaf,

$patterns = 'PRD', 'DR', 'TEST'

ForEach( $prefix in $patterns) {
    Get-ADComputer -Filter "Name -like '$($prefix)*'" |
        ForEach-Object {[int]($_.Name -replace '(?:.*?)(\d+)\Z', '$1')} |
        Measure-Object -Maximum |
        ForEach-Object {$prefix + (++$_.Maximum).ToString('000')}
}

OK, so I have format the code like the above.
Is it possible to ignore the non-numerical value?

Is this “[int]($_.Name” not exactly what Olaf was saying, about not being able to define [int]‘nineteen’, except you’re trying to define [int]'PRD", [int]‘DR’, [int]‘TEST’.

$patterns = 'PROD', 'TEST', 'DR'
$CurrentADComputerName = $null
$NextADComputerName = $null

ForEach ( $prefix in $patterns) {
    
    $CurrentADComputerName = Get-ADComputer -Filter "Name -like '$($prefix)*'" | 
        Sort-Object Name | 
        Select-Object -Expand Name | 
        Select-Object -Last 1
    Write-Host "The current AD Computername for $prefix is: $CurrentADComputerName" -BackgroundColor Blue -ForegroundColor Yellow

    $CurrentOULocation = (Get-ADComputer $CurrentADComputerName -Properties *).DistinguishedName

    $NextADComputerName = Get-ADComputer -Filter "Name -like '$($prefix)*'" |
        ForEach-Object {[int]($_.Name -replace '(?:.*?)(\d+)\Z', '$1')} |
        Measure-Object -Maximum |
        ForEach-Object {$prefix + (++$_.Maximum).ToString('000')}
    Write-Host "The next available AD Computername for $prefix is: $NextADComputerName" -BackgroundColor Blue -ForegroundColor Green
    Write-Host "Which can be deployed in OU: $CurrentOULocation `n`n" -BackgroundColor Blue -ForegroundColor White

}

OK, I have modified it like the above code, but so far I need to suppress the error with the AD object that is like the below:

Cannot convert value "PRD23-OLD" to type "System.Int32". Error: "Input string was not in a correct format." Cannot convert value "TEST72-DEV" to type "System.Int32". Error: "Input string was not in a correct format."
and how to display the OU location like: domain.com/SITE 1/Server/Production not as DN with CN ?

No. You need to “extract/separate” the numbers from whatever string you have, cast it to [INT], treat it accordingly and use this for whatever further action you need to do.

No you have not. You still have the “[int]” in your code.
Change your code line 16 from

ForEach-Object {[int]($.Name -replace ‘(?:.*?)(\d+)\Z’, '1')} |</pre> ... to .... <pre>ForEach-Object {(.Name -replace ‘(?:.*?)(\d+)\Z’, ‘$1’)} |

I’d recommend for you to make a little step back and take your time to learn the basics of Powershell. You cannot learn a technology properly by guessing.