Private/Get-VMSubfolderPath.ps1

function Get-VMSubfolderPath {

    [CmdletBinding()]
    Param (
        [Parameter(Mandatory)]
        [string]$VMName,
        [Parameter(Mandatory)]
        [string]$HostName,
        [Parameter(Mandatory)]
        [string]$Path
    )

    $ErrorActionPreference = [System.Management.Automation.ActionPreference]::Stop

    Write-Debug -Message ('ENTER {0}' -f $MyInvocation.MyCommand.Name)

    Write-Debug -Message ('$VMName: ''{0}''' -f $VMName)
    Write-Debug -Message ('$HostName = ''{0}''' -f $HostName)
    Write-Debug -Message ('$Path = ''{0}''' -f $Path)

    try {
        Write-Debug -Message ('ENTER TRY {0}' -f $MyInvocation.MyCommand.Name)

        Write-Debug -Message ('$NewPath = [System.IO.Path]::Combine(''{0}'', ''{1}'')' -f $Path, $VMName)
        $SubFolderPath = [System.IO.Path]::Combine($Path, $VMName) # Join-Path cannot combine paths on a drive which does not exist on the machine
        Write-Debug -Message ('$SubFolderPath = ''{0}''' -f $SubFolderPath)

        Write-Debug -Message '$NewPath = $SubFolderPath'
        $NewPath = $SubFolderPath
        Write-Debug -Message ('$NewPath = ''{0}''' -f $NewPath)

        Write-Debug -Message '$Counter = 0'
        $Counter = 0
        Write-Debug -Message ('$Counter = {0}' -f $Counter)
        do {
            if ($Counter -gt 0) {
                Write-Debug -Message ('$NewPath = ''{{0}}-{{1}}'' -f ''{0}'',''{1}''' -f $SubFolderPath, $Counter)
                $NewPath = '{0}-{1}' -f $SubFolderPath, $Counter
                Write-Debug -Message ('$NewPath = ''{0}''' -f $NewPath)
            }
            Write-Debug -Message ('$Folder = Get-FolderCimObject -ComputerName ''{0}'' -Path ''{1}''' -f $HostName, $NewPath)
            $Folder = Get-FolderCimObject -ComputerName $HostName -Path $NewPath
            Write-Debug -Message ('$Folder: ''{0}''' -f $Folder)
            Write-Debug -Message '$Counter++'
            $Counter++
            Write-Debug -Message ('$Counter = {0}' -f $Counter)
        }
        while ($Folder)

        Write-Debug -Message '$NewPath'
        $NewPath

        Write-Debug -Message ('EXIT TRY {0}' -f $MyInvocation.MyCommand.Name)
    }
    catch {
        Write-Debug -Message ('ENTER CATCH {0}' -f $MyInvocation.MyCommand.Name)

        Write-Debug -Message ('{0}: $PSCmdlet.ThrowTerminatingError($_)' -f $MyInvocation.MyCommand.Name)
        $PSCmdlet.ThrowTerminatingError($_)

        Write-Debug -Message ('EXIT CATCH {0}' -f $MyInvocation.MyCommand.Name)
    }

    Write-Debug -Message ('EXIT {0}' -f $MyInvocation.MyCommand.Name)
}