cmdlets/Common1C.ps1

. $PSScriptRoot\CommonUtils\CommonUtils.ps1

#----------------------------------------------------------------------------------------
# Выделяет из переданной строки каталог установки, номер весрии платформы и путь к exe файлу
function Get-VersionCatalogExe {
<#
    .SYNOPSIS
        Из переданной строки выделяет каталог установки и(или) номер версии платформы и(или) путь к exe файлу.
    .DESCRIPTION
        Входной строкой может быть пустая строка, каталог установки 1С, номер версии платформы, полный путь к exe файлу.
        Если передан полный путь к exe файлу, то из него будут выделены каталог установки и версия платформы, если это возможно.
        Возвращается словарь с тремя ключами InstalledLocation1C, VersionPlatform1C, FileExe
    .PARAMETER InputString
        Входная строка для разбора.
#>

[CmdletBinding()]
param(
    [string]$InputString
)
    $Result = @{'InstalledLocation1C' = ''; 'VersionPlatform1C' = ''; 'FileExe' = ''}
    if ($InputString -match '^\d+\.\d+\.\d+\.\d+$')
    {
        $Result['VersionPlatform1C'] = $InputString
    } 
    elseif ('' -ne $InputString -and (Test-Path $InputString)) 
    {
        $DirFile = Get-Item $InputString
        if ($DirFile.PSIsContainer)
        {
            $InstalledLocation1C = $DirFile.FullName
            if ($InstalledLocation1C[-1] -ne '\' -or $InstalledLocation1C[-1] -ne '/') {
                $InstalledLocation1C += '\'
            }
            $Result['InstalledLocation1C'] = $InstalledLocation1C
        } 
        elseif ($DirFile.Extension -eq '.exe')
        {
            $FileExe = $InputString
            if ($FileExe -match '\\\d+\.\d+\.\d+\.\d+\\' -or $FileExe -match '\/\d+\.\d+\.\d+\.\d+\/'){
                $Result['VersionPlatform1C'] = $Matches[0].Trim('\').Trim('/')
                $Result['InstalledLocation1C'] = $FileExe.Substring(0, $FileExe.IndexOf($Result['VersionPlatform1C']))
            }
            $Result['FileExe'] = $FileExe
        }
    }
    Write-Verbose ('FileExe = {0}' -f $FileExe)
    Write-Verbose ('InstalledLocation1C = {0}' -f $InstalledLocation1C)
    Write-Verbose ('VersionPlatform1C = {0}' -f $VersionPlatform1C)
    $Result
}# end of Get-VersionCatalogExe

#----------------------------------------------------------------------------------------
# Получает исполняемый файл платформы
function Get-Exe1C {
<#
    .SYNOPSIS
        Получает исполняемый файл платформы.
    .DESCRIPTION
        По переданной строке поиска пытается определить исполняемый файл платформы.
        Входной строкой поиска может быть:
        - пустая строка - будет произведен поиск исполняемого файла в стандартном каталоге последней установленной версии платформы
        - каталог установки 1С - в указанном каталоге будет произведен поиск исполняемого файла последней установленной версии
        - номер версии платформы в формате 8.3.XX.XXXX - в стандартном каталоге установки, в подкаталоге с заданным номером версии
                                                         будет произведен поиск исполняемого файла
        - можно передать сам exe файл, тогда без поиска вернется он же
        Если переданный каталог установки или файл не существуют или не установлена переденная версия,
        то возвращается исполняемый файл последней установленной версии найденный в стандартном каталоге установки.
        Дополнительно можно передать имя исполняемого файла (по умолчанию 1cv8).
    .PARAMETER SearchString
        Входная строка поиска.
    .PARAMETER FileName
        Имя исполняемого файла (по умолчанию 1cv8).
#>

[CmdletBinding()]
param(
    [string]$Search,
    [string]$FileName='1cv8'
)
    $ResultFileExe = ''
    $InstalledLocation1C = Get-InstalledLocation1C
    $Name = Get-VersionCatalogExe $Search
    if ('' -ne $Name.InstalledLocation1C) { $InstalledLocation1C = $Name.InstalledLocation1C }

    #region GetExe
    if ('' -ne $Name.FileExe -and (Test-Path $Name.FileExe)) {
        $ResultFileExe = $Name.FileExe
    } 
    elseif ('' -ne $Name.VersionPlatform1C)
    {
        $CatalogInstalled1C = $InstalledLocation1C + $Name.VersionPlatform1C
        if (Test-Path $CatalogInstalled1C) {
            $FileExe = Get-ChildItem $CatalogInstalled1C -Name "$FileName.exe" -Recurse | Sort-Object -Descending
            if ($FileExe -is 'System.Array' -and 0 -ne $FileExe.Length) {
                $FileExe  = $FileExe[0]
            }
            if ($CatalogInstalled1C[-1] -ne '\' -or $CatalogInstalled1C[-1] -ne '/') {
                $CatalogInstalled1C += '\'
            }
            if ($null -ne $FileExe) { $ResultFileExe = $CatalogInstalled1C + $FileExe }
        }
    }
    #endregion GetExe

    if ('' -eq $ResultFileExe)
    {
        # Найдем последнюю установленную версию в стандартном (или переданном) каталоге установки
        $FileExe = Get-ChildItem $InstalledLocation1C -Name "$FileName.exe" -Recurse | Sort-Object -Descending
        if ($FileExe -is 'System.Array' -and 0 -ne $FileExe.Length) {
            $FileExe  = $FileExe[0]
        }
        if ($null -ne $FileExe) { $ResultFileExe  = $InstalledLocation1C + $FileExe }
    }
    $ResultFileExe
}# end Get-Exe1C

#----------------------------------------------------------------------------------------
# Определяет каталог установки 1С
function Get-InstalledLocation1C
{
    <#
    .SYNOPSIS
        Определяет каталог установки 1С.
    .DESCRIPTION
        По файлам 1cestart.cfg пытается определить каталог установки платформы.
 
    .PARAMETER v82
        Возвращает только каталог версии платформы 8.2.
#>

    [CmdletBinding()]
    param(
        [switch]$v82
    )
    $Path1cv8 = @()
    $FileName = '\1c\1CEStart\1CEStart.cfg'
    $FilePath = $Env:ALLUSERSPROFILE + $FileName
    Get-Content $FilePath | Where-Object {$_ -match "InstalledLocation="} | ForEach-Object {
        $Path1cv8 += ($_ -split '=')[1]
    }
    $FilePath = $Env:APPDATA + $FileName
    Get-Content $FilePath | Where-Object {$_ -match "InstalledLocation="} | ForEach-Object {
        $Path1cv8 += ($_ -split '=')[1]
    }

    $Filter = "1cv8$"
    if ($v82){ $Filter = "1cv82" }

    $Path1cv8 = $Path1cv8 | Sort-Object -Descending | Where-Object {$_ -match $Filter}
    $Path1cv8 | ForEach-Object{ Write-Verbose $_ }
    
    $Result = $Path1cv8
    if ($Path1cv8 -is [System.Array]){ $Result = $Path1cv8[0] }
    if (($null -eq $Path1cv8) -or !(Test-path $Result)) {
        $Result = 'C:\Program Files\1cv8'
        if (!(Test-path $Result)){
            $Result = 'C:\Program Files (x86)\1cv8'
            if (!(Test-Path $Result)){
                Write-Warning 'Не найдена платформа 1С.'
            }
        }
    }
    $Result+'\'
}# end of Get-InstalledLocation1C()