Last Updated:

Парсинг 1CV8Clst.lst

Korchagin 1C
# Путь к файлу 1CV8Clst.lst
$clusterFile = "C:\code\PowerShell\1c\1CV8Clst.lst"

if (-not (Test-Path $clusterFile)) {
    Write-Error "Файл $clusterFile не найден!"
    exit 1
}

$data = Get-Content -Path $clusterFile -Raw

# Функция для точного извлечения ClusterServer из начала файла
function Get-ClusterServer {
    param ($content)
   
    # Ищем конкретную структуру в начале файла с учетом дефиса в имени
    $pattern = '{\s*0,[^{]+{[^}]+"[^"]*-\d*"[^}]*{[^}]*"([^"-]+-[^"]+)",\s*(\d+)'
    $match = [regex]::Match($content, $pattern)
   
    if ($match.Success) {
        $server = $match.Groups[1].Value.Trim()
        $port = $match.Groups[2].Value.Trim()
        return "${server}:${port}"
    }
    else {
        # Дополнительная попытка найти альтернативный формат
        $altPattern = '{\s*0,[^{]+{[^}]+"([^"-]+-[^"]+)",\s*(\d+)'
        $altMatch = [regex]::Match($content, $altPattern)
       
        if ($altMatch.Success) {
            $server = $altMatch.Groups[1].Value.Trim()
            $port = $altMatch.Groups[2].Value.Trim()
            return "${server}:${port}"
        }
    }
   
    Write-Warning "Не удалось определить ClusterServer в файле"
    return "Unknown:0"
}

$clusterServer = Get-ClusterServer -content $data
Write-Host "Определен ClusterServer: $clusterServer" -ForegroundColor Cyan

# Парсинг баз данных
$dbPattern = '\{[0-9a-f-]+,"[^"]+","[^"]+","[^"]+","[^"]+","[^"]+"[^}]*\}'
$dbMatches = [regex]::Matches($data, $dbPattern)

$result = @()

foreach ($match in $dbMatches) {
    $block = $match.Value
    $fields = $block -split ',' | ForEach-Object { $_.Trim('"{}') }
   
    if ($fields.Count -ge 6) {
        $dbName = $fields[2]
        $dbmsType = $fields[3]
        $sqlServer = $fields[4]
        $dbNameInSql = $fields[5]
       
        $connStringPart = $fields[8]
        $dbsrvr = if ($connStringPart -match 'DBSrvr=([^;]+)') { $matches[1] } else { $sqlServer }
       
        $result += [PSCustomObject]@{
            BaseName      = $dbName
            DBMS          = $dbmsType
            SQLServer     = $dbsrvr
            DBNameInSQL   = $dbNameInSql
            ClusterServer = $clusterServer
        }
    }
}

# Вывод результатов
$result | Format-Table -AutoSize

# Экспорт в CSV
#$csvPath = Join-Path (Split-Path $clusterFile) "1C_Databases_Report_$(Get-Date -Format 'yyyyMMdd_HHmmss').csv"
#$result | Export-Csv -Path $csvPath -NoTypeInformation -Encoding UTF8 -Force
#Write-Host "Отчет сохранен в $csvPath" -ForegroundColor Green