Шаблон скрипта

#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