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() |