Get-1C.ps1
|
<#
.SYNOPSIS .DESCRIPTION Получение информации о сервере 1С: -пути к файлам ЖР -размер директорий файлов ЖР для каждой базы .PARAMETER Path The path that will be searched for a registry key. .EXAMPLE Mgm1CMainMenu .INPUTS System.String .OUTPUTS Microsoft.Win32.RegistryKey .NOTES This module is an example of what a well documented function could look. .LINK #> function Get-1C{ param( [string]$BaseRegPath = "HKLM:\SYSTEM\CurrentControlSet\Services", [string]$SearchPattern = "1C:Enterprise*" ) # Получаем пути к srvinfo из реестра $srvinfoPaths = @() if (Test-Path $BaseRegPath) { $serverKeys = Get-ChildItem -Path $BaseRegPath | Where-Object { $_.PSChildName -like $SearchPattern } foreach ($serverKey in $serverKeys) { $regValues = Get-ItemProperty -Path $serverKey.PSPath foreach ($property in $regValues.PSObject.Properties) { if ($property.Value -match '-d\s+"([^"]*srvinfo[^"]*)"') { $srvinfoPaths += $matches[1] } } } } else { Write-Host "Ключ реестра $BaseRegPath не найден." } if ($srvinfoPaths.Count -eq 0) { Write-Host "Не удалось найти пути к директориям srvinfo в реестре." } # Массив для итоговых данных из файлов $jsonArray = @() # Поиск файлов 1CV8Clst.lst в найденных директориях foreach ($path in $srvinfoPaths) { $files = Get-ChildItem -Path $path -Filter "1CV8Clst.lst" -File -Recurse -ErrorAction SilentlyContinue foreach ($file in $files) { $content = Get-Content $file.FullName foreach ($line in $content) { # Инициализируем объект с предопределёнными свойствами $jsonObject = [ordered]@{ Descr = "" DescrState = 1 Ref = $null DB = $null DBSrvr = $null DBID = $null DBCacheSize = 0 FilePath = "" } # Поиск параметра Descr if ($line -match 'Descr\s*=\s*""([^""]*)""') { $descrValue = $matches[1].Trim() -replace '\\', '' $jsonObject.Descr = $descrValue $jsonObject.DescrState = if ($descrValue -eq "" -or $descrValue -eq ";") { 1 } else { 0 } } # Поиск остальных параметров if ($line -match 'Ref\s*=\s*([^;]+)') { $jsonObject.Ref = $matches[1] } if ($line -match '\bDB=([^;]+)') { $jsonObject.DB = $matches[1] } if ($line -match 'DBSrvr\s*=\s*([^;]+)') { $jsonObject.DBSrvr = $matches[1] } if ($line -match '^{?([0-9a-fA-F-]{36})') { $jsonObject.DBID = $matches[1].Trim('{') # Определяем путь к папке по DBID и вычисляем её размер $basePath = [System.IO.Path]::GetDirectoryName($file.FullName) $dbFolderPath = Join-Path -Path $basePath -ChildPath $jsonObject.DBID if (Test-Path $dbFolderPath) { $folderSize = (Get-ChildItem -Path $dbFolderPath -Recurse -Force | Measure-Object -Property Length -Sum).Sum $jsonObject.DBCacheSize = $folderSize } } # Добавляем путь к файлу (одинарные слеши) $jsonObject.FilePath = $file.FullName -replace '\\\\', '\' # Если найдены значения Ref и DB, добавляем объект в массив if ($jsonObject.Ref -and $jsonObject.DB) { $jsonArray += $jsonObject } } } } $finalJSON = $null if ($jsonArray.Count -gt 0) { [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 $finalJSON = $jsonArray | ConvertTo-Json -Depth 4 } # Возвращаем объект с двумя свойствами: # SrvinfoPaths - массив путей из реестра # FileInfoJSON - JSON с данными из файлов return [pscustomobject]@{ SrvinfoPaths = $srvinfoPaths FileInfoJSON = $finalJSON } } <# # Пример вызова функции $result = Get-1CV8ClstInfo if ($result) { Write-Host "Найденные пути (SrvinfoPaths):" $result.SrvinfoPaths | ForEach-Object { Write-Host $_ } Write-Host "`nДанные из файлов (FileInfoJSON):" Write-Host $result.FileInfoJSON } #> |