cmdlets/Read-iBases.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
. $PSScriptRoot\CommonUtils\CommonUtils.ps1

New-Alias -Name 'Parse-iBases' -Value 'Read-iBases'

#----------------------------------------------------------------------------------------
# возвращает путь к файлу iBases.v8i
function Get-iBasesFullName
{
<#
    .SYNOPSIS
        Возвращает полный путь по умолчанию к файлу iBases.v8i.
    .DESCRIPTION
        Проверяет наличие и возвращает полный путь к файлу iBases.v8i.
        Если файл не существует, то возвращается $null.
        Расположение файла iBases.v8i по умолчанию:
            - Для ОС Windows: %APPDATA%\1C\1CEStart\
#>

    $Result = $null
    if (Test-Path("$env:APPDATA\1C\1CEStart\iBases.v8i")){$Result = "$env:APPDATA\1C\1CEStart\iBases.v8i"}
    $Result
}# end of Get-iBasesFullName

#----------------------------------------------------------------------------------------
# получает файл списка объектов для захвата из отчета сравнения
function Read-iBases
{
<#
    .SYNOPSIS
        Преобразует содержимое файла iBases.v8i в массив хэш-таблиц.
    .DESCRIPTION
        Преобразует текстовый файл настроек запуска баз iBases.v8i в массив хэш-таблиц,
        где в каждой хэш-таблице перечисленны все указаные для одной базы параметры.
    .PARAMETER FilePath
        Полный путь к файлу iBases.v8i, если не указан будет взят из профиля текущего пользователя.
        Для ОС Windows: %APPDATA%\1C\1CEStart\iBases.v8i.
    .EXAMPLE
        #Получить список файловых баз запускаемых на платформе 8.3:
        $FileBases = Read-iBases | where {$_.Connect -macth 'File*' -and $_.Version -match '8.3*'}
    .EXAMPLE
        #Показать идентификаторы и имена баз запускаемых на платформе 8.3:
        Read-iBases | where {$_.Version -match '8.3*'} | foreach{Write-Host ("{0} {1}" -f $_.ID, $_.Name)}
    .EXAMPLE
        #Сформировать файл Descript.ion (для любителей Far):
        #в каталог ...\APPDATA\Local\... (кэш метаданых)
        Read-iBases | foreach{"{0} {1}" -f $_.ID, $_.Name} > $env:LOCALAPPDATA\1C\1cv8\Descript.ion
 
        #в каталог ...\APPDATA\Roaming\... (настройки пользователя)
        Read-iBases | foreach{"{0} {1}" -f $_.ID, $_.Name} > $env:APPDATA\1C\1cv8\Descript.ion
#>

[CmdletBinding()]
param(
    [string]$FilePath # полный путь к файлу iBases.v8i
)

    if ($FilePath -eq '') {$FilePath = Get-iBasesFullName}
    Write-Verbose "FilePath = $FilePath"
    $BufferBases = @{}
    switch -Regex -File $Filepath {
        "^\[(.+)\]$" {
            Write-Verbose ("`n`t Секция '{0}'" -f $matches[1])
            if ($Section -ne $null){$BufferBases[$NameBase] = $Section}
            $NameBase = $matches[1]
            $Section = @{Name = $NameBase}
        }
        "^([^=]+)=(.*)$" {
            Write-Verbose ("Ключ '{0}' = '{1}'" -f $matches[1], $matches[2])
            $Section[$matches[1]] = $matches[2]
        }
    }
    $iBases = @()
    $BufferBases.Keys | Sort-Object | foreach{
        if ($BufferBases[$_]['Connect'] -ne $null){$iBases += $BufferBases[$_]}
    }
    $iBases

}# end of Read-iBases