#Requires -Version 5.1 #Requires -RunAsAdministrator # Удалить если права администратора не нужны Set-StrictMode -Version Latest $ErrorActionPreference = 'Stop' [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 #region === Пути и переменные === $Root = if ($PSScriptRoot) { $PSScriptRoot } else { Split-Path $MyInvocation.MyCommand.Path } $CSVIn = Join-Path $Root 'data_in.csv' $CSVOut = Join-Path $Root 'data_out.csv' $HTMLOut = Join-Path $Root 'report.html' $Results = [System.Collections.Generic.List[PSCustomObject]]::new() #endregion #region === Загрузка вспомогательных функций из файла 'helpers.ps1' === # . (Join-Path $Root 'helpers.ps1') # Раскомментировать если нужен внешний файл функций #endregion #region === Источник данных (оставить один нужный блок) === # --- Вариант А: встроенный массив строк --- # $Data = @' # строка1 # строка2 # строка3 # '@ -split "`r?`n" | Where-Object { $_.Trim() } | ForEach-Object { $_.Trim() } # --- Вариант Б: CSV-файл --- # if (-not (Test-Path $CSVIn)) { Write-Warning "Файл не найден: $CSVIn"; exit 1 } # $Data = Import-Csv -Path $CSVIn -Encoding UTF8 -Delimiter ';' | # Where-Object { $_.PSObject.Properties.Value -ne '' } | # Sort-Object fio # --- Вариант В: конфиг из .psd1 --- # $Cfg = Import-PowerShellDataFile -Path (Join-Path $Root 'config.psd1') # Пример config.psd1: # @{ # StatePath = 'C:\scripts\state.txt' # Smtp = @{ Server = 'mx.company.ru'; Port = 25; UseSsl = $false # From = 'bot@company.ru'; To = 'admin@company.ru' } # } # --- Вариант Г: жёсткий список объектов --- # $Data = @( # [PSCustomObject]@{ Name = 'Анна'; Age = 30 } # [PSCustomObject]@{ Name = 'Олег'; Age = 25 } # [PSCustomObject]@{ Name = 'Ирина'; Age = 55 } # ) #endregion #region === Обработка === foreach ($Item in $Data) { try { Write-Verbose "Обработка: $Item" # --- логика здесь --- $Results.Add([PSCustomObject]@{ Timestamp = Get-Date -Format 'HH:mm:ss' Value = $Item User = $env:USERNAME }) } catch { Write-Warning "Ошибка [$Item]: $_" } } #endregion #region === Вывод результатов === if ($Results.Count -eq 0) { Write-Warning 'Нет данных для экспорта.'; exit 0 } # Консоль $Results | Format-Table -AutoSize # CSV $Results | Export-Csv -Path $CSVOut -NoTypeInformation -Encoding UTF8 -Delimiter ';' # HTML $Results | ConvertTo-Html ` -Title "Отчёт $(Get-Date -Format 'dd.MM.yyyy')" ` -Head '<style>body{font-family:Arial}table{border-collapse:collapse}td,th{border:1px solid #ccc;padding:5px}</style>' ` -PreContent "<h2>Результаты</h2><p>Дата: $(Get-Date)</p>" | Out-File $HTMLOut -Encoding UTF8 Write-Host "Готово → $CSVOut" -ForegroundColor Green # Invoke-Item $CSVOut # Открыть CSV после завершения # Invoke-Item $HTMLOut # Открыть HTML после завершения #endregion #region === Отправка почты === # $MailParams = @{ # From = 'bot@company.ru' # To = 'admin@company.ru' # Subject = "Отчёт $(Get-Date -Format 'dd.MM.yyyy')" # Body = 'Скрипт завершён. Результаты во вложении.' # SmtpServer = 'smtp.company.local' # Port = 25 # Attachments = @($CSVOut, $HTMLOut) # # UseSSL = $true # # Credential = Get-Credential # } # Send-MailMessage @MailParams #endregion